[C]Passage de tableau de structures ds 1 fctn
Résolu/Fermé
A voir également:
- [C]Passage de tableau de structures ds 1 fctn
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Le fichier contient un tableau présentant un extrait des livres les plus prêtés à paris en 2016. filtrez le tableau pour ne faire apparaître que les bandes dessinées ado. puis filtrez le tableau pour ne faire apparaître que celles dont l'auteur est zep. quel est le titre de la bande dessinée ado de zep qui a été la plus prêtée d'après ce tableau ? ✓ - Forum Windows 10
- Clémence souhaite faire calculer automatiquement les prix de 30 produits dans trois devises. elle a déjà saisi une formule de calcul pour le tarif du premier produit dans la première devise. corrigez sa formule afin que recopiée vers le bas puis vers la droite, elle remplisse correctement tout le tableau. - Forum Excel
11 réponses
Je me suis trompé dans le quote, il n'y a évidemment qu'une seule allocation :
int loadDict(FILE *dictFile, struct symbolStruct** symbolList, int wordCount){ short int i = 0; if ( (dictFile = fopen("dict", "r")) == NULL) { fprintf(stderr,"Dictionnary file can't be opened!\n"); return 0; } symbolList = malloc(wordCount*sizeof(struct symbolStruct*)); for ( i = 0; i < wordCount; i++){ symbolList[i] = malloc(sizeof(struct symbolStruct));} .. } int main(int argc, char* argv[]){ FILE* dictDescriptor; int wordCount; struct symbolStruct** symbolList; loadDict(dictDescriptor, symbolList); .. }
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
17 nov. 2007 à 20:08
17 nov. 2007 à 20:08
tu as oublié de faire le cast pour le malloc c'est surement pour ça que tu as des erreur a ce niveau
essaye ça
et
essaye ça
symbolList = (struct symbolStruct **) malloc(wordCount*sizeof(struct symbolStruct*));
et
symbolList[i] = (struct symbolStruct *) malloc(sizeof(struct symbolStruct));
Merci de te pencher sur mon problème !
Avec ta solution, cela compile bien, et le malloc ne génère pas d'erreur. Cependant j'ai un segmentation fault lorsque j'essaye d'affecter les structures, par exemple :
Avec ta solution, cela compile bien, et le malloc ne génère pas d'erreur. Cependant j'ai un segmentation fault lorsque j'essaye d'affecter les structures, par exemple :
(*symbolList[i]).firstPx = 2;
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
17 nov. 2007 à 21:31
17 nov. 2007 à 21:31
en general c'est un debordement de memoire tu es sure d'avoir alloué assez de memoire ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ca plante à la toute première affectation, pour i=0 :(
Soit je ne fais pas l'allocation avec malloc de la bonne façon, soit je n'affecte pas de la bonne façon... ?
Soit je ne fais pas l'allocation avec malloc de la bonne façon, soit je n'affecte pas de la bonne façon... ?
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
17 nov. 2007 à 21:46
17 nov. 2007 à 21:46
essaye sans le "*"
(symbolList[i]).firstPx = 2;
request for member ‘firstPx’ in something not a structure or union..
Il est pas venu le jour où les pointeurs seront clairs pour moi :/
Il est pas venu le jour où les pointeurs seront clairs pour moi :/
mype
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
436
17 nov. 2007 à 23:48
17 nov. 2007 à 23:48
c'est peu etre une question bete mais as tu placer l'affectation au bon endroit ?
for ( i = 0; i < wordCount; i++){ symbolList[i] = malloc(sizeof(struct symbolStruct)); (symbolList[i]).firstPx = 2;}
C'était peut-être bête mais c'était mon erreur à peu de chose près...
Je faisais d'abord une bouche pour allouer puis une seconde pour affecter et j'avais oublié de réinitialiser i à 0.. Je m'excuse :)
Ceci dit j'ai toujours un problème : à l'intérieur de la fonction où je fais l'allocation et l'affectation tout se passe bien, mais une fois sorti de celle-ci j'ai bien un segmentation fault
Je faisais d'abord une bouche pour allouer puis une seconde pour affecter et j'avais oublié de réinitialiser i à 0.. Je m'excuse :)
Ceci dit j'ai toujours un problème : à l'intérieur de la fonction où je fais l'allocation et l'affectation tout se passe bien, mais une fois sorti de celle-ci j'ai bien un segmentation fault
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
18 nov. 2007 à 09:43
18 nov. 2007 à 09:43
Salut,
(*symbolList[i]).firstPx = 2;
c'est plutôt comme ça mais je préfère les flèches.
regarde cet exemple
(*symbolList[i]).firstPx = 2;
c'est plutôt comme ça mais je préfère les flèches.
regarde cet exemple
lami20j@debian:~/trash$ cat ccm.c #include <stdio.h> #include <stdlib.h> int main(void) { struct symbolStruct { int firstPx; int firstPy; }; struct symbolStruct** symbolList; symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[0] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); (*symbolList[0]).firstPx = 2; symbolList[0]->firstPy = 20; printf("firstPx = %d\n",symbolList[0]->firstPx); printf("firstPy = %d\n",symbolList[0]->firstPy); symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[1] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); (*symbolList[1]).firstPx = 5; symbolList[1]->firstPy = 50; printf("firstPx = %d\n",symbolList[1]->firstPx); printf("firstPy = %d\n",symbolList[1]->firstPy); return 0; } lami20j@debian:~/trash$ gcc ccm.c lami20j@debian:~/trash$ ./a.out firstPx = 2 firstPy = 20 firstPx = 5 firstPy = 50
Du coup c'est exactement ce que je fais, mais dans une fonction qui prend comme paramètre struct symbolStruct** symbolList.
Mon problème est que j'appelle cette fonction dans le main, qu'à l'intérieur de celle-ci les structures sont bien initialisées, mais que si je fais, par exemple
Les valeurs affichées sont erronées !?
Si je reprends ton exemple, voilà ce que j'essaye de faire :
Et bien entendu c'est aux printf du main que cela plante (seg fault).
Mon problème est que j'appelle cette fonction dans le main, qu'à l'intérieur de celle-ci les structures sont bien initialisées, mais que si je fais, par exemple
printf("%d %d %d %d %c\n", symbolList[0]->firstPx, symbolList[0]->secondPx, symbolList[0]->thirdPx, symbolList[0]->fourthPx, symbolList[0]->symbol);
Les valeurs affichées sont erronées !?
Si je reprends ton exemple, voilà ce que j'essaye de faire :
#include <stdio.h> #include <stdlib.h> struct symbolStruct { int firstPx; int firstPy; }; int load(struct symbolStruct** symbolList) { symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[0] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); symbolList[0]->firstPx = 2; symbolList[0]->firstPy = 20; printf("firstPx = %d\n",symbolList[0]->firstPx); printf("firstPy = %d\n",symbolList[0]->firstPy); symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[1] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); symbolList[1]->firstPx = 5; symbolList[1]->firstPy = 50; printf("firstPx = %d\n",symbolList[1]->firstPx); printf("firstPy = %d\n",symbolList[1]->firstPy); return 0; } int main(void) { struct symbolStruct** symbolList; load(symbolList); printf("firstPx = %d\n",symbolList[1]->firstPx); printf("firstPy = %d\n",symbolList[1]->firstPy); return 0; }
Et bien entendu c'est aux printf du main que cela plante (seg fault).
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 567
18 nov. 2007 à 12:25
18 nov. 2007 à 12:25
c'est normal puisque ta fonction retourne un entier mais tu as besoin qu'elle retourne un pointeur sur la structure
lami20j@debian:~/trash$ cat ccm.c #include <stdio.h> #include <stdlib.h> struct symbolStruct { int firstPx; int firstPy; }; struct symbolStruct ** load(struct symbolStruct** symbolList) { symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[0] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); symbolList[0]->firstPx = 2; symbolList[0]->firstPy = 20; printf("firstPx = %d\n",symbolList[0]->firstPx); printf("firstPy = %d\n",symbolList[0]->firstPy); symbolList = (struct symbolStruct**) malloc (sizeof(struct symbolStruct*)); symbolList[1] = (struct symbolStruct*) malloc (sizeof(struct symbolStruct)); symbolList[1]->firstPx = 5; symbolList[1]->firstPy = 50; printf("firstPx = %d\n",symbolList[1]->firstPx); printf("firstPy = %d\n",symbolList[1]->firstPy); return symbolList; } int main(void) { struct symbolStruct** symbolList; symbolList = load(symbolList); printf("Dans main\n"); printf("firstPx = %d\n",symbolList[1]->firstPx); printf("firstPy = %d\n",symbolList[1]->firstPy); return 0; } lami20j@debian:~/trash$ gcc ccm.c lami20j@debian:~/trash$ ./a.out firstPx = 2 firstPy = 20 firstPx = 5 firstPy = 50 Dans main firstPx = 5 firstPy = 50