Jump to content

realloc array de structs dentro de uma struct


iron
 Share

Recommended Posts

typedef struct volume
{
const char *id_volume;
const char *title;
const char *type;
const char *information;
int publicDomain;
} Volume;
typedef struct collection
{ 
int numberOfVolumes;
int positions;
Volume *volumes[32];

} Collection;
//falta aumentar a memoria
int incrementArrayVolumeFromCollection(Collection *res)
{
res->volumes = realloc(res->volumes, sizeof(res->volumes)*2);
res->positions*=2;
   if (res->volumes == NULL)
   {
       fprintf(stderr, "***error: not enough memory\n");
       return 0;
}
return res->positions;
}

Boas.

Queria fazer o realloc do meu array, mas não estou a perceber o meu erro.

Alguém me consegue explicar qual o erro?

Desde já obrigado.

Edited by thoga31
GeSHi

Cumprimentos,
iron

Link to comment
Share on other sites

Imprime o tamanho do array com os tamanhos de cada struct de volumes em cada posição, o tamanho total se não estou em erro.

Ai estava na duvida se faria sizeof(res->volumes)/sizeof(res->volumes[0])*2 ou se como estava.

O erro que dá é este:

error: incompatible types when assigning to type ‘struct Volume *[32]’ from type ‘void *’

e é na linha do realloc.

P.S. Já tentei vários casts, mas dá sempre erro.

Edited by iron

Cumprimentos,
iron

Link to comment
Share on other sites

Imprime o tamanho do array com os tamanhos de cada struct de volumes em cada posição, o tamanho total se não estou em erro.

se achas isso faz o seguinte teste:

int size = 32;

printf("tamanho de uma estrutura             : %d\n", sizeof(Volume));
printf("tamanho de um array de %d estruturas : %d\n", size, sizeof(Volume) * size);
printf("tamanho do tipo de dados que tens    : %d\n", sizeof(res->volumes));

o que achas que é ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

O primeiro é o tamanho de cada struct de Volume.

O segundo é o tamanho de cada Volume*size, que deveria ser o tamanho do array.

O terceiro é o tamanho só do array.

Só que os dois últimos prints não percebi. Eles não deveriam dar o mesmo tamanho?


tamanho de uma estrutura : 20
tamanho de um array de 32 estruturas : 640
tamanho do tipo de dados que tens : 128
Edited by iron

Cumprimentos,
iron

Link to comment
Share on other sites

Só que os dois últimos prints não percebi. Eles não deveriam dar o mesmo tamanho?

era exactamente ai que eu queria chegar

a tua variável res->volumes não é um array de estruturas do tipo Volume, mas sim um array de ponteiros para estruturas do tipo Volume

Volume *volumes[32];
//     A
//     |
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Tens mais um erro no teu código, não é assim que se faz um realloc, o realloc por omissão retorna NULL em caso de erro, imagina o que acontec ao teu res->volume se o realloc falhar, a abordagem correcta é algo como:

 // (...)
 Volume* chunk = realloc (res->volume, res->positions * 2);
 if (chunk) res->volume = chunk;
 else  fprintf (stderr, "Failed to realloc");
 // (...)

EDIT: typo.

Edited by crowseye
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.