iron Posted December 30, 2015 at 09:48 PM Report Share #591151 Posted December 30, 2015 at 09:48 PM (edited) 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 December 31, 2015 at 04:30 AM by thoga31 GeSHi Cumprimentos, iron Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 30, 2015 at 10:28 PM Report Share #591152 Posted December 30, 2015 at 10:28 PM (edited) porque dizes que dá erro ? ps : vê o que estás a fazer com o seguinte código : printf("size : %d\n", sizeof(res->volumes)); Edited December 30, 2015 at 10:29 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
iron Posted December 31, 2015 at 05:07 AM Author Report Share #591154 Posted December 31, 2015 at 05:07 AM (edited) 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 December 31, 2015 at 05:20 AM by iron Cumprimentos, iron Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 31, 2015 at 09:16 AM Report Share #591155 Posted December 31, 2015 at 09:16 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
iron Posted December 31, 2015 at 02:29 PM Author Report Share #591161 Posted December 31, 2015 at 02:29 PM (edited) 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 December 31, 2015 at 02:33 PM by iron Cumprimentos, iron Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 31, 2015 at 04:12 PM Report Share #591162 Posted December 31, 2015 at 04:12 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
iron Posted December 31, 2015 at 08:18 PM Author Report Share #591166 Posted December 31, 2015 at 08:18 PM Acho que estou a perceber. Mas sendo assim, como faço para ser um array de estruturas? Cumprimentos, iron Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 1, 2016 at 02:16 AM Report Share #591170 Posted January 1, 2016 at 02:16 AM olha bem para o código que coloquei (principalmente o comentário) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
crowseye Posted January 1, 2016 at 07:54 AM Report Share #591171 Posted January 1, 2016 at 07:54 AM (edited) 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 January 1, 2016 at 07:55 AM by crowseye Link to comment Share on other sites More sharing options...
iron Posted January 1, 2016 at 06:53 PM Author Report Share #591180 Posted January 1, 2016 at 06:53 PM Já percebi. E já consegui resolver o problema. Obrigado. Cumprimentos, iron Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now