Warning incompréhensible en C
Résolu
wid²
Messages postés
202
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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 :
----------------------------------------------
----------------------------------------------
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) :
----------------------------------------------
----------------------------------------------
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
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
A voir également:
- Warning incompréhensible en C
- Warning zone telechargement - Accueil - Outils
- Téléchargement et streaming illégal : voici les adresses des sites pirates que les FAI vont bloquer - Accueil - Services en ligne
- Message incompréhensible - Forum iPhone
- Cpu fan fail warning control - Forum Matériel & Système
- Symbole warning word ✓ - Forum Word
4 réponses
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...
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.