Problème header

Résolu/Fermé
cap'tain sheeps - 17 mai 2011 à 14:16
 le père - 19 mai 2011 à 15:37
Bonjour,
J'ai toujours eu de problèmes avec les headers, et je m'en suis toujours sorti "à l'arrache", mais là, je n'ai pas vraiment le choix, et ca me pose vraiment problème, ce que je vais vous expliquer de suite:
Je veux qu'une variable de type gchar* soit partagé entre mes fichiers.
J'ai donc dans mon fichier main:
#include "generateur.c"

dans mon fichier generateur.c:
#include "generateur.h"

et dans mon generateur.h (entre autres):
extern gchar* cheminFichierFil;


Mais quand je veux changer la valeur de mon cheminFichierFil dans mon fichier main, le compilateur me dis que cheminFichierFil n'est pas déclaré ...

Je vous supplie donc de m'aider parce que les headers et moi sommes en guerre depuis mes débuts.
Merci d'avance,
Sheeps.

34 réponses

cap'tain sheeps
19 mai 2011 à 11:41
et enfin les erreurs:
obj\Debug\generateur.o||In function 'Z19TraitementBoutonGenP10_GtkWidgetPcS1_10Continuite9Isolement':|
C:\Documents and Settings\jfaure\Bureau\stage1\testtest\generateur.cpp|8|multiple definition of 'isolement'|
obj\Debug\main.o:C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|46|first defined here|
obj\Debug\generateur.o||In function 'Z19TraitementBoutonGenP10_GtkWidgetPcS1_10Continuite9Isolement':|
C:\Documents and Settings\jfaure\Bureau\stage1\testtest\generateur.cpp|9|multiple definition of 'continuite'|
obj\Debug\main.o:C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|48|first defined here|
||=== Build finished: 4 errors, 0 warnings ===|

0
En effet, c'est très différent... Ce n'est plus le compilateur qui se plaint, c'est l'éditeur de liens (L I N K E R). Il y a des choses qui sont définies plusieurs fois (d'où l'importance de ne pas confondre définition et déclaration). Je regarde et je te fais signe
0
Cap'tain sheeps
19 mai 2011 à 11:58
Merci beaucoup !
0
Vu le problème...

Dans ton fichier generateur.h, les lignes Isolement isolement; et Continuite continuite; sont de DEFINITIONS de variables (il n'y a pas "extern") et non pas des déclarations.
Quand tu inclus generateur.h dans main.cpp, il crée donc ces variables.
Quand tu inclus generateur.h dans generateur.cpp, il les crée aussi.
Au moment de l'édition de liens, ces variables existent deux fois : c'est ça la double définition
Dans ton fichier .h, il faut mettre

extern Isolement isolement;
extern Continuite continuite;

Ça ce ne sont que des déclarations. Ça ne crée pas de variables, mais ça dit au compilateur qu'elles existent quelque part : tu peux compiler, il les connaît.
Par contre, il faudra bien créer réellement ces variables quelque part (mais une seule fois)
Le plus logique dans ton cas est dans generateur.c :
Isolement isolement;
Continuite continuite;
(pas avant le include generateur.h, sinon il ne connaît pas les types Isolement et Continuite)
0

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

Posez votre question
cap'tain sheeps
19 mai 2011 à 13:40
okok, j'ai capté le truc et j'ai modifié ce qui était à modifier merci beaucoup.
Petit bémol (et tu vas rire):
Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue.
J'ai donc supposé que je pouvais laisser la déclaration: extern gchar* cheminFichierFil; dans le generateur.h et le définir: gchar* cheminFichierFil; dans le generateur.cpp. Mais il ne me le reconnait toujours pas, et je suis obligé de le définir dans le main.cpp.
Une fois défini dans le main (pour vérifier le fonctionnement de l'isolement et de la continuité), j'ai fais ce que tu m'as dis et me retrouve toujours avec une multiple définition...
Désolé d'avoir à t'apprendre ca... ^^
0
Petit bémol (et tu vas rire): grrr... je l'aurai un jour, je l'aurai... ^^

Je ne sais pas pourquoi l'erreur pour le cheminFichierFil est revenue Effectivement, s'il n'y a pas de définition, c'est normal d'avoir cette erreur. Peux-tu copier le message exact pour vérifier qu'il s'agit bien d'un problème d'édition de lien et non pas de compilation ?

le définir: gchar* cheminFichierFil; dans le generateur.cpp. . Ça devrait être bon... À quelle ligne de ton fichier generateur.c as-tu mis cette ligne ?
As-tu fait un rebuild complet du projet ?
0
Non, c'est un problème de compilation pour la première erreur:
C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp||In function 'int main(int, char**)':| 
C:\Documents and Settings\jfaure\Bureau\stage1\testtest\main.cpp|110|error: 'cheminFichierFil' was not declared in this scope| 
||=== Build finished: 1 errors, 0 warnings ===| 


Je l'ai mis au tout début, juste après la ligne #include "generateur.h" (dans generateur.cpp, generateur.c n'existant plus)

J'ai fais un rebuild complet, rien ne change...
0
J'avoue que je ne comprends pas ... Avant midi, ça, compilait, le problème était à l'édition de liens. Les modifs que je t'ai fait faire à 12h05 n'ont aucun rapport avec cette variable.
Peux-tu revenir à la situation d'avant midi et recréer la même erreur à l'édition de lien, sans erreur de compilation ?
0
cap'tain sheeps
19 mai 2011 à 14:41
J'ai essayé, mais à tous les coups j'avais oublié de remettre en commentaire le
gchar* cheminFichierFil = NULL;
dans le main.cpp, du coup il le connaissait forcément.
Si tu veux essayer l'autre problème, je le remet, et ca me donne bien les erreurs du L I N K E R sur la continuité et l'isolement. Même avec seulement les extern dans le .h et sans aucune déclaration.
Pourtant crois-moi, il n'y a que extern Isolement isolement; et pareil pour lla continuité dans le .h ...
Ca commence à devenir de l'acharnement la ... ^^
0
Chaque chose en son temps, commençons par la compilation
As-tu bien un seul fichier generateur.h ? Tes 3 fichiers sont-ils bien dans le même répertoire ?
0
cap'tain sheeps
19 mai 2011 à 15:04
Mes 3 fichiers sont dans le même répertoire et je n'ai qu'un .h
j'ai un "generateur.h.gch" par contre c'est pas gênant?
0
Ça m'étonnerait que ça le dérange... Dans le doute, peux-tu le déplacer ou le renommer ?

En essayant de reproduire ton cas de figure chez moi, j'ai vu qu'il n'acceptait pas les points dans les define. Peux-tu au début de generateur.h remplacer
#ifndef generateur.h
#define generateur.h
par
#ifndef generateurh
#define generateurh
0
cap'tain sheeps
19 mai 2011 à 15:29
YOUHOOOO ! ! !
Ca marche !
Du coup j'ai fais l'isolement et la continuité tout seul grace à tes explications.
Tout ca pour 2 petits points ...
Merci énormément !
T'as fini par l'avoir ^^
0
Ouf !
Heureux de t'avoir rendu service.
J'vais aller prendre un café tranquille, maintenant ;)
0