Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problemas con AnsiString (https://www.clubdelphi.com/foros/showthread.php?t=29111)

aoiTo 12-01-2006 17:31:56

Problemas con AnsiString
 
Siguiendo vuestro consejo, y despues de dar un vistazo a la guia de estilo, vuelvo a escribir el mensaje.
Lo dicho, este es el codigo:

Código:

#ifndef _TALBUM_
#define _TALBUM_

  typedef struct{
      AnsiString Album;
      AnsiString Grupo;
      AnsiString Estilo;
      AnsiString Cover;
      int Formato;
  }tAlbum;

  tAlbum *Catalogo;

#endif

Código:

void __fastcall TfrmCMusica::FormActivate(TObject *Sender)
{
 int i=0,j;
 AnsiString disco;

 if(!access("album.txt",0)){
    memoAux->Lines->LoadFromFile("album.txt");
    i = memoAux->Lines->Count;
 }

 //Reservamos memoria para el vector
 Catalogo=(tAlbum*)malloc(sizeof(tAlbum)*i);

 //Inicializamos el vector con los discos que ya tenemos guardados
 for(j=0;j<i;j++){
    disco = memoAux->Lines->operator [](j);
    Catalogo[j].Album = disco.SubString(1,disco.Pos(":")-1);
    disco.Delete(1,disco.Pos(":"));

    Catalogo[j].Grupo = disco.SubString(1,disco.Pos(":")-1);/*aqui falla*/
    disco.Delete(1,disco.Pos(":"));

    Catalogo[j].Estilo = disco.SubString(1,disco.Pos(":")-1);
    disco.Delete(1,disco.Pos(":"));
    Catalogo[j].Formato= disco.ToInt();
 }

}

Pues eso que falla al ejecutar en el ligar indicado y no se porque sera, porque (segun creo) no hay que reservar memoria para un AnsiString, pero lo que ya no entiendo es porque al declarar Catalogo como un array estatico si funciona.
A ver si ahora me podeis ayudar, que me perdonen los que se hayan molestado.

Sonic 18-01-2006 10:26:58

Buenas aoiTo!

Muchas gracias por remodelar tu mensaje. La verdad es que hacía ya tiempo que no usaba la función malloc para reservar memoria. No he podido dedicarle mucho tiempo a tu problema por lo que aún no comprendo el motivo, pero lo que sí puedo es aportar un par de soluciones:

He comprobado que si en vez de reservar memoria con la función malloc lo haces con la función calloc o con la función new, no da esos problemas, por si no conoces estas funciones (si conoces malloc me extraña que no conozcas calloc, pero por si las moscas) te pongo un ejemplo aplicado.

En el caso del calloc:

Código:

Catalogo= (tAlbum *)calloc(i,sizeof(tAlbum));
y en el caso del new

Código:

Catalogo= (tAlbum *)new tAlbum[i];
y ya continuando con la explicación te cuento que la memoria reservada con calloc se libera con la orden free igual que al usar malloc, pero que si lo que has usado a sido new (la opción que te recomiendo), la forma de liberar la memoria es así:

Código:

delete [] Catalogo;

Espero que te sirva de ayuda, seguramente esta tarde le dedique un poco más de tiempo a ver si consigo darle alguna explicación al problema.

Hasta la próxima!


La franja horaria es GMT +2. Ahora son las 00:45:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi