Appel de fonctions définies dans un autre fichier

Signaler
Messages postés
4
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
7 avril 2006
-
Messages postés
4
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
7 avril 2006
-
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

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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...
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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();
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
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
Messages postés
4
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
7 avril 2006

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 ?
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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?
Messages postés
4
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
7 avril 2006

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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
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);
Messages postés
4
Date d'inscription
vendredi 3 février 2006
Statut
Membre
Dernière intervention
7 avril 2006

Merci bcp Guillemouze, c'est très sympa de ta part. :-)
Je vais regarder ça avec attention dès ce soir.