GNT sans publicité, site mobile, fonctionnalitées exclusives...

turpitudes du c : prototype de fonction erreur de code ou erreur avec l'ide geany sur ubuntu

Le
bpascal123
Bonjour cyberespace,
je viens de me rendre compte que quand je déclare le prototype de la
fonction suivante :

15: void CheckFile(FILE *FP_FILE) ;

le message de precompilation :

gcc -Wall -o "exPract1" "exPract1.c" (in directory: /media/XP/code_c)
exPract1.c: In function ‘main’:

exPract1.c:15: note: expected ‘struct FILE *’ but argument is of type
‘char *’

Compilation finished successfully.

Je répète des exercices beaucoup de fois avec des noms de variables ou
fonctions différents alors peut-être (très probablement) j'ai déj=
à
utilisé le nom CheckFile comme nom de fonction. Mais aucun souvenir
d'y avoir déclaré une structure comme paramètre Mon ide est geany.
Peut-être CheckFile est dans le cache de l'ide???

Ce qui me fait supposer que ça vient de l'ide est que si je change de
nom, par exemple : CheckMyFile, ça fonctionne sans messages

Quelqu'un quelque part peut-il m'expliquer?

Merci,
Lire les 16 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #22625651
""
Bonjour cyberespace,
je viens de me rendre compte que quand je déclare le prototype de la
fonction suivante :

15: void CheckFile(FILE *FP_FILE) ;

le message de precompilation :

gcc -Wall -o "exPract1" "exPract1.c" (in directory: /media/XP/code_c)
exPract1.c: In function ‘main’:

exPract1.c:15: note: expected ‘struct FILE *’ but argument is o f type
‘char *’



FILE est une macro, apparent definie a struct FILE dans ton cas.

Le probleme est que tu as un appel a CheckFile a la ligne 15 de exPract1.c
(si la ligne que tu as donnee ci-dessus est celle de exPract1.c, donne tout
le fichier si il est de taille raisonnable) qui a comme argument un char*
plutot qu'un FILE*.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
bpascal123
Le #22628351
Voici le programme qui entraîne un message sur la ligne "void
OpenFileM(FILE *FP_FILE) ;" avec quelque chose comme FP_FILE devraît
être une structure

Je viens de me rendre compte que même si je change le nom de la
fonction OpenFileM, le message qui apparaît lors de la compilation
continue à apparaître.

Mais le programme s'exécute comme attendue. Je ne sais pas à quoi est
dû ce message.

#include */
#include
#define CRECMAX 10 /* nbr d'enreg. max */
#define CTXTMAXL 20 /* long. de caracteres max */

void OpenFileM(FILE *FP_FILE) ;

int main(void)
{
FILE *MP_SOURCE = NULL ;
FILE *MP_DESTI = NULL ;
char MPSource[] = "/media/XP/code_c/data15a.txt" ;
char MPDesti[] = "/media/XP/code_c/data15rev.txt" ;

printf("nOuverture de "data15a.txt" : n") ;
MP_SOURCE = fopen(MPSource, "r") ;
OpenFileM(MPSource) ;

printf("nn") ;
return 0 ;
}
bpascal123
Le #22628451
Après une seconde lecture de votre post Jean-Marc, je viens de voir
l'erreur.
J'appel CheckFile avec un argument de type char au lieu de *FILE ...
Confusion de noms...

ça devrait etre:
...
printf("nOuverture de "data15a.txt" : n") ;
MP_SOURCE = fopen(MPSource, "r") ;
OpenFileM(MP_SOURCE) ;
...
Ce qui m'a troublé, c'est le message du compilateur qui fait mention
d'une structure quelque part...

Mais par ce message d'erreur résolu, je pense comprendre que FILE *
est une structure ou plutot un pointeur vers une structure (j'ai une
expérience trop négligeable des structures pour essayer de comprendre
plus loin).

Si j'essaye d'écrire dans le prototype de la fonction :
CheckFile(struct FILE *FP_FILE) ; ?

ça ne donne pas le résultat prévu:

gcc -Wall -c "exPract1.c" (in directory: /media/XP/code_c/encours)
exPract1.c:15: warning: ‘struct FILE’ declared inside parameter list
exPract1.c:15: warning: its scope is only this definition or
declaration, which is probably not what you want
exPract1.c: In function ‘main’:
exPract1.c:31: warning: passing argument 1 of ‘OpenFile’ from
incompatible pointer type
exPract1.c:15: note: expected ‘struct FILE *’ but argument is of type
‘struct FILE *’
exPract1.c: At top level:
exPract1.c:54: warning: ‘struct FILE’ declared inside parameter list
exPract1.c:54: error: conflicting types for ‘OpenFile’
exPract1.c:15: note: previous declaration of ‘OpenFile’ was here
Compilation failed.

C'est juste une expérimentation parmi tant d'autre que le langage c
permet de faire. En fait ce n'est pas un langage qui permet tant
d'expérimentation pour être honnête, à mon niveau de débutant, to ut
semble avoir été prévu. Je compte explorer encore un peu ce langage
pour être plus à l'aise avec des types de données qu'on retrouve dans
d'autres langages, notamment les langages objets.

Merci
Jean-Marc Bourguet
Le #22629191
""
En fait ce n'est pas un langage qui permet tant
d'expérimentation pour être honnête



Le C n'est pas un langage qui peut etre appris par experimentation. Il y a
un beaucoup trop de choses non definies, non specifiees et definies par
l'implementation pour ca. On peut arriver par experimentation a avoir le
resultat, mais les raisons qui font que l'on obtienne ce resultat tiennent
du hasard, donc les circonstances changeant un peu, on ne l'obtient plus.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
candide
Le #22637471
Jean-Marc Bourguet a écrit :
""
En fait ce n'est pas un langage qui permet tant
d'expérimentation pour être honnête



Le C n'est pas un langage qui peut etre appris par experimentation. Il y a
un beaucoup trop de choses non definies, non specifiees et definies par
l'implementation pour ca.




Le débutant cherche déjà à comprendre comment ça fonctionne dans son
implémentation (et encore, il ne le dira pas comme ça, parce que le
débutant ne sait pas vraiment ce que recouvre ce terme d'"implémentation").

Les expérimentations sont un moyen d'apprendre et surtout de comprendre
comment le code qu'écrit le débutant s'exécute sur la machine. Cela
correspond souvent à une stratégie d'essais/erreurs. Je crois qu'il faut
féliciter le PO de prendre ce genre d'initiative, beaucoup de
débutants n'osent pas les engager. Au passage, je ferais remarquer que
de nombreux intervenants très pragmatiques de ce forum prônent
implicitement un apprentissage occasionnel par expérimentations. Hélas,
que les débutants (et moins débutants aussi d'ailleurs) doivent recourir
à ce type d'apprentissages montre surtout à quel point la documentation
sur le langage C est défaillante ...
Publicité
Suivre les réponses
Poster une réponse
Anonyme