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
Bonjour à tous,


avis aux codeurs motivés :

j'ai un warning à la compilation (rien de grave, ça marche quand même) et j'aimerais bien savoir pourquoi... si ça se trouve, ça vient juste de la norme qui est trop restrictive mais c'est peut-être un truc que je fais trop à la bourrin...


je fais un malloc pour créer un tableau de tableau :

----------------------------------------------
#define LONGUEUR 35


char *dico = NULL;
int nbmot;      
/* nombre de mot dans le fichier à traiter. le calcul de cette variable n'est pas montré ici */
FILE *fichier = NULL    
/* fichier à traiter, l'ouverture n'est pas non plus montrée ici. */


dico = malloc((nbmot * LONGUEUR) * sizeof(char)); 
/* dico est de la forme "char[nbmot][LONGUEUR]". il faut donc réserver comme mémoire "nbmot * LONGUEUR" case de type char. */

----------------------------------------------


ensuite, j'ai une fonction "copie" qui copie (d'où le nom \o/) tous les mots d'un fichier dans le tableau "dico" (ci-dessous la ligne d'appel à la fonction et le prototype de la fonction) :


----------------------------------------------
copie(fichier, dico, nbmot);

//prototype de la fonction :
void copie (FILE *fichier, char tab[][LONGUEUR], int leng);

----------------------------------------------


et je me tappe comme warning :
passing arg 2 of `copie' from incompatible pointer type main.c /initdico ligne 31 C/C++ Problem

pourtant, ma variable "dico" est bien un pointeur sur char :s

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
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 :

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,
0
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...
0
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
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.
0
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
Cela marche effectivement si c'est géré en sorte derrière. Mais, vous voulez savoir l'explication du warning...
0
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
@ devinf : mwaha !!! t'es veské ?
0