Warning incompréhensible en C
Résolu/Fermé
wid²
Messages postés
202
Date d'inscription
mardi 8 juillet 2008
Statut
Membre
Dernière intervention
12 juin 2012
-
21 févr. 2010 à 01:01
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 févr. 2010 à 01:47
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 févr. 2010 à 01:47
A voir également:
- Warning incompréhensible en C
- Warning zone telechargement - Accueil - Services en ligne
- Quota warning free - Guide
- Pcl xl error warning illegal media type - Forum Imprimante
- Message incompréhensible - Forum iPhone
- Téléchargement direct : les bonnes adresses des sites pirates - Accueil - Outils
4 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
21 févr. 2010 à 01:28
21 févr. 2010 à 01:28
Bonsoir,
Votre déclaration de la variable "dico" n'est pas bonne.
/* dico est de la forme "char[nbmot][LONGUEUR]". il faut donc réserver comme mémoire "nbmot * LONGUEUR" case de type char. */
Ok, donc, il s'agit d'un type char **dico;
Pourtant vous mettez :
char *dico = NULL;
Il manque une dimension.
dico = malloc((nbmot * LONGUEUR) * sizeof(char));
Ici, vous réservez une zone de nbmot*Longueur bytes dans le heap qui contiendra des char.
Ce que vous voulez, c'est une zone de nbmot qui contiendront des adresses sur des mots.
Pour ceci il faut donc mettre :
J'ai mis des petits points pour penser à régler les erreurs.
Petit rappel : malloc(LONGUEUR) permettra de mettre des mots de tailles LONGUEUR-1. Sinon il faut rajouter +1 dans le malloc pour le stockage du '\0' final.
Enfin, il ne faut pas non plus oublier à bien tout vider les allocations. En tout il doit y avoir nbmot +1 free.
Tout ceci devrait faire disparaître le message du compilateur. Il voit un char* au lieu d'un char** attendu.
Cdlt,
Votre déclaration de la variable "dico" n'est pas bonne.
/* dico est de la forme "char[nbmot][LONGUEUR]". il faut donc réserver comme mémoire "nbmot * LONGUEUR" case de type char. */
Ok, donc, il s'agit d'un type char **dico;
Pourtant vous mettez :
char *dico = NULL;
Il manque une dimension.
dico = malloc((nbmot * LONGUEUR) * sizeof(char));
Ici, vous réservez une zone de nbmot*Longueur bytes dans le heap qui contiendra des char.
Ce que vous voulez, c'est une zone de nbmot qui contiendront des adresses sur des mots.
Pour ceci il faut donc mettre :
char **dico; int i; ... dico=malloc(nbmot); if(dico==NULL) { ... } for(i=0;i<nbmot;i++) { dico[i]=malloc(LONGUEUR); if(dico[i]==NULL) { ... } }
J'ai mis des petits points pour penser à régler les erreurs.
Petit rappel : malloc(LONGUEUR) permettra de mettre des mots de tailles LONGUEUR-1. Sinon il faut rajouter +1 dans le malloc pour le stockage du '\0' final.
Enfin, il ne faut pas non plus oublier à bien tout vider les allocations. En tout il doit y avoir nbmot +1 free.
Tout ceci devrait faire disparaître le message du compilateur. Il voit un char* au lieu d'un char** attendu.
Cdlt,
il est 1h30 du mat, donc attends plutôt demain pour des réponses, les gens dorment là...
on est pas tes chiens, donc merci de montrer un peu de respect et t'auras sûrement plus de réponses si t'écris en français correct...
on est pas tes chiens, donc merci de montrer un peu de respect et t'auras sûrement plus de réponses si t'écris en français correct...
wid²
Messages postés
202
Date d'inscription
mardi 8 juillet 2008
Statut
Membre
Dernière intervention
12 juin 2012
18
21 févr. 2010 à 01:36
21 févr. 2010 à 01:36
merci beaucoup !!! je n'y avais pas pensé effectivement :s
pour tout ce qui est des erreurs de malloc et de libérer la mémoire, c'est dans le programme, mais pour pas alourdir le message, j'avais mis que l'essentiel ;)
quand on créé un tableau de tableau du style : dico[15][10], il réserve en mémoire 15 * 10 (*sizeof(type)) cases consécutives, et c'est ce que je voulais reproduire là (d'ailleurs, ça marche :p)
mais votre manière semble effectivement plus correcte bien que plus compliquée.
pour tout ce qui est des erreurs de malloc et de libérer la mémoire, c'est dans le programme, mais pour pas alourdir le message, j'avais mis que l'essentiel ;)
quand on créé un tableau de tableau du style : dico[15][10], il réserve en mémoire 15 * 10 (*sizeof(type)) cases consécutives, et c'est ce que je voulais reproduire là (d'ailleurs, ça marche :p)
mais votre manière semble effectivement plus correcte bien que plus compliquée.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
21 févr. 2010 à 01:47
21 févr. 2010 à 01:47
Cela marche effectivement si c'est géré en sorte derrière. Mais, vous voulez savoir l'explication du warning...
wid²
Messages postés
202
Date d'inscription
mardi 8 juillet 2008
Statut
Membre
Dernière intervention
12 juin 2012
18
21 févr. 2010 à 01:38
21 févr. 2010 à 01:38
@ devinf : mwaha !!! t'es veské ?