Appel de fonctions définies dans un autre fichier

djedai91 Messages postés 4 Date d'inscription vendredi 3 février 2006 Statut Membre Dernière intervention 7 avril 2006 - 2 avril 2006 à 22:27
djedai91 Messages postés 4 Date d'inscription vendredi 3 février 2006 Statut Membre Dernière intervention 7 avril 2006 - 7 avril 2006 à 18:29
Bonjour,
Ma question va peut-être bête mais je reste bloquée dans mon projet informatique à cause de cela.
En fait, j'aurais aimé savoir comme faire pr appeler une fonction définies dans un autre fichier.
Lorsque j'ajoute un fichier .c à mon projet .dsw et que dans ce dernier je met #include fichier.c puis j'appelle une fonction du fichier .c, il n'y a pas de soucis. Mais quand je commence à en mettre en autre, en procédant dans la même manière, rien ne va plus.
J'ai entendu parler qu'il fallait mettre toutes ses déclarations et prototypes de fcts dans un .h puis faire un #include fichier.h, mais ça ne marche pas.
Il y a qqc que je ne saisis pas et je dois certainement faire une erreur qqpart.
Si qqu a une réponse à me fournir, ce serait super sympa et ça m'arrangerait bien.
Merci d'avance !

14 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 avril 2006 à 22:36
je suis pas sûre:

//dans un fichier c à part
int mafonc (LPSTR test)
{
return strlen(test);
}

// dans le fichier c appelent la fonction sans #include
extern int mafonc (LPSTR test);

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 avril 2006 à 22:38
quand je dit sans #include c'est que tu n'inclue pas le fichier c avec la fonction dedans. Tu la met seulement en compilation avec les autres.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 avril 2006 à 23:04
J'ai jamais compris l'intérêt de mettre extern devant la déclaration d'une fonction, tu peux peut-être m'éclairer?
Pour les variables bien sur c'est utile car la déclaration et fait offica de définition, mais pas les fonctions...
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
2 avril 2006 à 23:06
heu g pas tout compris ske tu raconte SAKingdom !!!

tu peu regarder les sources sur le forum pour voir a quoi ca doit ressembler.
le principe est tout simple. il y a 2 points importants :
- quand dans du code tu as un appel a une fonction, il faut que celle ci soit definie plus haut
- tu peu declarer une fonction a un endroit, et l'implementer plus loin.
c sur ce principe que sont fait les .h (header)
voila un bref resume :

int main (int argc, cahr**argv) {
int x = mafonction();
return 0;
}
int mafonction() {
return 5;
}

Ce code ne marche pas car mafonction est definie apres l'appel
On peut donc faire ca:

int mafonction(); // ceci est le prototype de la fonction (type_retour + nom_fonction + arguments)

int main (int argc, cahr**argv) {

int x = mafonction();

return 0;

}

int mafonction() {

return 5;

}


La ca marche parceque mafonction est definie avant son appel
tu peu ensuite creer un fichier .h:

fichier.h

#ifndef __FICHIER_H_
#define __FICHIER_H_
int mafonction(); // ceci est le prototype de la fonction (type_retour + nom_fonction + arguments)

int main (int argc, cahr**argv);
#endif



fichier.c

#include "fichier.h"

int main (int argc, cahr**argv) {


int x = mafonction();


return 0;


}


int mafonction() {


return 5;


}



le #ifndef sert a faire que le fichier soit linké une seule fois
maintenant tu peu utiliser la fonction mafonction dans nimporte quel fichier en specifiant le #include "fichier.c" dans le ficheir quiu en a besoin

unautrefichier.c

#include "fichier.c"
void uneautrefonction() {
int x = mafonction();
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 avril 2006 à 23:10
J'espère que la fin est une erreur, et que tu voulais inclure le fichier .h
En général on ne met pas le main dans un .h, car personne ne devrait appeler cette fonction
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
2 avril 2006 à 23:18
oue c un include "fichier.h" trompage :s
le main dans le .h, c juste pour lexemple on peut tout mettre dans le .h, c juste ke c vrai que ca se fait pas.

pour les extern, ca veut dire que tu as une variable globale dans un autre fichier qui n'est pas include, mais dont tu as besoin.c utile par exemple pour les references croisees. par exemple:

fic1.h

#include "fic2.h"
typedef struct {...} ma_struct;
...

fic1.c

mastruct ms;
...

fic2.c

#include "fic1.h"
extern ma_struct ms;
...

la tu peu pas mettre le #include "fic1.h" dans fic2.h, donc tu est obliger de declarer ms en extern, paske sinon il la voit pas a la compile, mais juste au linkage
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 avril 2006 à 23:18
Ah. J'devien peut-être fou. J'ai tout faux(encore). Mais je cite ce que je disait plus haut > "Je suis pas sûre"

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
3 avril 2006 à 02:29
Ben oui [auteurdetail.aspx?ID=184734 Guillemouze], ta tout à fait raison. J'fait ça tout le temp. J'sais pas pourquoi j'ai dit ça. Ça doit être l'heure (même si j'ai 6 heures de décalage avec l'heure afficher dans le forum)

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
djedai91 Messages postés 4 Date d'inscription vendredi 3 février 2006 Statut Membre Dernière intervention 7 avril 2006
4 avril 2006 à 20:09
Bonjour,

Merci pour vos réponses, cela m'a déjà permis de faire un pas en avant.
Cependant, en faisant toutes ces manip (celles de Guillemouze dans son dernier message), il me reste des erreurs que je n'arrive pas à résoudre, bien qu'ayant tourné mon prog dans les sens. Elles sont du type :

error C2143: syntax error : missing ')' before '*'

sur une ligne du type :

void Lister (const char *fic, ma_struct *structure){
}

Que puis-je faire ?
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 avril 2006 à 09:16
ca veut certainement dire quil connai pas ma_struct. tu es sur que tu a bien fait le include du fichier contenant la definition de ma_struct avant la declarartion de ta fonction?
0
djedai91 Messages postés 4 Date d'inscription vendredi 3 février 2006 Statut Membre Dernière intervention 7 avril 2006
6 avril 2006 à 13:21
Bonjour,

Toujours bloquée lol !



Alors en fait je n'avais pas fait de "extern ..." alors du coup, ça m'enlève certaines erreurs.

Mais ça n'exécute tjrs pas.



Mes structures de fichiers sont-elles bonnes ?



main.cpp

#include "fic1.h";

#include "fic2.h";



int main (void){

.....

}



fic1.h

#include <stdio.h> /* Par exemple*/

typedef struct {...}ma_struct ;

void Lister(ma_struct variable);



fic1.c

#include "fic1.h" /* Sans lui, on dirait que ça ne marcher pas */

void Lister(ma_struct variable){

.....

}



fic2.h

#include <stdio.h>

extern ma_struct variable;


void Afficher(ma_struct variable);



fic2.c

"include "fic2.h";

void Afficher(ma_struct variable);



Merci d'avance !!!

Bonne journée
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
7 avril 2006 à 09:26
main.cpp
#include "fic1.h";
#include "fic2.h";

int main (void){
lister(...) // tu peu faire appele a ces fonctions grace au include
afficher(...)
.....
}

fic1.h
#include <stdio.h> /* Par exemple*/
typedef struct {...}ma_struct ;
void Lister(ma_struct variable);

fic1.c
#include "fic1.h" /* Sans lui, on dirait que ça ne marcher pas */ <= dans ton xxx.c, il faut toujours include le xxx.h
void Lister(ma_struct variable){
.....
}

fic2.h
#include <stdio.h>
//la il connais pas ma_struct qui est defini dans fic1.h. il faut donc faire:
#include "fic1.h"
extern ma_struct variable; //ca, ca veut dire que dans un fichier que tu include, il y a une declarartion du genre
//ma_struct variable;
//c'est a dire que tu a une variable globale de type ma_struct qui s'appele variable
void Afficher(ma_struct variable);

fic2.c
"include "fic2.h";
void Afficher(ma_struct variable); //ici c bon car fic2.c inclu fic2.h qui inclu fic1.h qui contient ma_struct
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
7 avril 2006 à 09:29
precision:

fic2.h
#include <stdio.h>
//la il connais pas ma_struct qui est defini dans fic1.h. il faut donc faire:
#include "fic1.h"
extern ma_struct variable; //ca, ca veut dire que dans un fichier que tu include, ou dans tous les fichier qui include celui-ci (mais c pas tout a fait vrai, si tu veu + d'explications sur ce cas dis le moi), il y a une declarartion du genre
//ma_struct variable;

//c'est a dire que tu a une variable
globale de type ma_struct qui s'appele variable

void Afficher(ma_struct variable);
0
djedai91 Messages postés 4 Date d'inscription vendredi 3 février 2006 Statut Membre Dernière intervention 7 avril 2006
7 avril 2006 à 18:29
Merci bcp Guillemouze, c'est très sympa de ta part. :-)
Je vais regarder ça avec attention dès ce soir.
0
Rejoignez-nous