C++ Probleme de Lien entre classes
Résolu
velderama
Messages postés
199
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j'ai un probleme de "linkage" quand je lance mon fichier test.cpp ?? j'arrive pas a trouver pourquoi !!
****J'ai une classe qui lit un fichier et retourne le nombre de mots presents****
***Et j'ai une classe de test ***************
Et là il n'y pas d'erreur mais quand je le lance :
[Linker error] undefined reference to `ListeMot::lireFichier(std::basic_ifstream<char, std::char_traits<char> >&)'
J'arrive pas a voir le probleme !!
Merci d'avance
j'ai un probleme de "linkage" quand je lance mon fichier test.cpp ?? j'arrive pas a trouver pourquoi !!
****J'ai une classe qui lit un fichier et retourne le nombre de mots presents****
#include "Liste.h" inline bool ListeMot::is_delim(char c){ return !isalpha(c); } float ListeMot::lireFichier(ifstream &f){ string line; positon = 0; nbmot = 0.0; //tant qu'on n'a pas atteint la fin de fichier for(unsigned no_line = 0;std::getline(f,line);++no_line){ unsigned beg = 0; unsigned end = 1; for(unsigned no_mot=0;end <line.size();++no_mot){ //On positionne a la fin du mot la variable "end" for(;end < line.size() && !is_delim(line[end]);++end); std::string mot(line,beg,end-beg);//recuperation du mot nbmot++; beg = end + 1; end = beg + 1; }//..line.size() }//fin fichier return nbmot; }//fin fonction lireFichier
***Et j'ai une classe de test ***************
#include "Liste.h" #include "Test.h" string affichage = " "; string Test::testfic(){ affichage += identiques(); return affichage; } string Test::identiques() { string ret; string nomtest =" Fichers Identiques"; char *file ="identique1.txt"; ifstream f(file); char *file2 ="identique2.txt"; ifstream f2(file2);; ListeMot l1,l2; float n1 = l1.lireFichier(f); float n2 = l2.lireFichier(f2); if(n1 == n2) return ret="*****Les 2 fichiers sont identiques !! \n\n"; else return ret = " *****Les 2 fichiers ne sont pas identiques !! \n\n";}
Et là il n'y pas d'erreur mais quand je le lance :
[Linker error] undefined reference to `ListeMot::lireFichier(std::basic_ifstream<char, std::char_traits<char> >&)'
J'arrive pas a voir le probleme !!
Merci d'avance
A voir également:
- C++ Probleme de Lien entre classes
- Lien url - Guide
- Créer un lien pour partager des photos - Guide
- Verificateur de lien - Guide
- Lien copié - Forum Mobile
- Lien mega ✓ - Forum Webmastering
17 réponses
Bonjour,
Peux-tu montrer le fichier listemot.h s'il te plaît ?
(C'est un peu singulier de prendre un nombre réel pour renvoyer un nombre de mots...)
M.
Peux-tu montrer le fichier listemot.h s'il te plaît ?
(C'est un peu singulier de prendre un nombre réel pour renvoyer un nombre de mots...)
M.
Oui non, les prototypes sont clean.
Par contre je crois que je la tiens quand même, héhé, la vilaine. ^^
Je ne vois pas où est la définition de "positon" dans lireFichier. J'aurais tendance à dire que tu mettrais la fameuse instruction 'pouet' en plein milieu du code qu'il ne le verrait pas non plus. Le fichier semble ne pas être compilé.
M.
Par contre je crois que je la tiens quand même, héhé, la vilaine. ^^
Je ne vois pas où est la définition de "positon" dans lireFichier. J'aurais tendance à dire que tu mettrais la fameuse instruction 'pouet' en plein milieu du code qu'il ne le verrait pas non plus. Le fichier semble ne pas être compilé.
M.
Non ca ne marche pas !
le probleme se situe dans la classe Test mais je ne sais pas où et comment ?!
Moi "qui vient " du java putain c'est délicat comme langage en tout cas
le probleme se situe dans la classe Test mais je ne sais pas où et comment ?!
Moi "qui vient " du java putain c'est délicat comme langage en tout cas
As-tu testé le pouet ?
Y a-t-il un fichier .o ou .obj de produit pour ListeMot ?
Quel est le compilo ?
M.
Y a-t-il un fichier .o ou .obj de produit pour ListeMot ?
Quel est le compilo ?
M.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pouet ?? oui il ya un "Liste.o" généré quand j'ai compilé puis j'ai compilé "test" sniff ca commence a...grrr
On oublie le pouet alors...
Je n'ai pas su ton compilo,
Il est fort probable que tu aies gcc
tu peux donc normalement compiler (seulement compiler) avec gcc -c test.cpp
(éventuellement avec gcc test.cpp liste.o si tu aimes griller les étapes)
ensuite seulement tu devrais pouvoir linker.
Sinon, bourinage: g++ liste.cpp test.cpp -o test.out
M.
PS:
Pas de panique, on améliorera les conditions de codage après.
Je n'ai pas su ton compilo,
Il est fort probable que tu aies gcc
tu peux donc normalement compiler (seulement compiler) avec gcc -c test.cpp
(éventuellement avec gcc test.cpp liste.o si tu aimes griller les étapes)
ensuite seulement tu devrais pouvoir linker.
Sinon, bourinage: g++ liste.cpp test.cpp -o test.out
M.
PS:
Pas de panique, on améliorera les conditions de codage après.
Le code paraît tout ce qu'il y a de plus correct.
J'ai peut-être une autre idée. Si c'est la première fois que tu utilises Dev-cpp peut-être n'as-tu pas créé de projet pour y mettre tes fichiers sources ?
Sinon tu peux toujours tester une chose... Dev-cpp utilise le compilateur (et linker) gcc.
On peux tenter de linker directement avec gcc puisque les fichiers sont déjà compilés.
Dans un console: "g++ test.o liste.o -o test.exe"
M.
J'ai peut-être une autre idée. Si c'est la première fois que tu utilises Dev-cpp peut-être n'as-tu pas créé de projet pour y mettre tes fichiers sources ?
Sinon tu peux toujours tester une chose... Dev-cpp utilise le compilateur (et linker) gcc.
On peux tenter de linker directement avec gcc puisque les fichiers sont déjà compilés.
Dans un console: "g++ test.o liste.o -o test.exe"
M.
Ce qui m'enerve le plus c'est que c'est une classe facile (voir banale ) a realiser et je me retrouve coincé par un truc de
lien entre classes cela me mets hors de moi pfff
lien entre classes cela me mets hors de moi pfff
-o test.exe est pour spécifier le nom de l'exécutable qui doit être généré à partir des .o
Je pensais que tu avais ton dev-cpp perso sur ta clef, non ? Il doit y avoir un gcc qui traîne quelque part. Ou au moins un compilateur quelconque.
Pour le fichier de projet c'est okay ?
M.
Je pensais que tu avais ton dev-cpp perso sur ta clef, non ? Il doit y avoir un gcc qui traîne quelque part. Ou au moins un compilateur quelconque.
Pour le fichier de projet c'est okay ?
M.
Je m'attendais plus à un ...\bin\gcc.exe
J'avais oublié les packages de notre ami Dev-Cpp...
Il semblerait que certaines personnes ayant Dev-cpp ont un répertoire ...\mingw32\bin\ Il n'est pas forcément dans celui de Dev-cpp et cela dépend peut-être aussi de l'installation de Dev-Cpp. (Dans mes souvenirs il y a une version complète et une pour ceux qui ont minGW)
Pour le fichier de projet c'est juste pour s'assurer que tu es bien passé par la création d'un nouveau projet, que tu y as ajouter tous tes fichiers sources etc. Il doit y avoir un fichier .dev.
M.
J'avais oublié les packages de notre ami Dev-Cpp...
Il semblerait que certaines personnes ayant Dev-cpp ont un répertoire ...\mingw32\bin\ Il n'est pas forcément dans celui de Dev-cpp et cela dépend peut-être aussi de l'installation de Dev-Cpp. (Dans mes souvenirs il y a une version complète et une pour ceux qui ont minGW)
Pour le fichier de projet c'est juste pour s'assurer que tu es bien passé par la création d'un nouveau projet, que tu y as ajouter tous tes fichiers sources etc. Il doit y avoir un fichier .dev.
M.
Je m'attendais plus à un ...\bin\gcc.exe
Exact il y est (un connaisseur...Up)
Pour le fichier de projet c'est juste pour s'assurer que tu es bien passé par la création d'un nouveau projet, que tu y as ajouter tous tes fichiers sources etc. Il doit y avoir un fichier .dev.
Peut etre c'est pour ca car je compilais les 2 .dev séparemment . Donc je vais creer un .dev avec tous les .h et .cpp necessaire ! je te tiens au courant
Exact il y est (un connaisseur...Up)
Pour le fichier de projet c'est juste pour s'assurer que tu es bien passé par la création d'un nouveau projet, que tu y as ajouter tous tes fichiers sources etc. Il doit y avoir un fichier .dev.
Peut etre c'est pour ca car je compilais les 2 .dev séparemment . Donc je vais creer un .dev avec tous les .h et .cpp necessaire ! je te tiens au courant
Tout est ok (plus ou moins )
Le consol ne se lance pas ?? pkoi ? i
#include "Liste.h" #include "Test.h" int main(int argc, char *argv[]){ const char *filename = argv[1]; const char *filename2 = argv[2]; ifstream ifs(argv[1]); ifstream if2s(argv[2]); //Pour le test if(argc != 3){ if(argv[1]=="--test"){ Test t; cout<<t.show()<<endl; system("PAUSE"); return 0; } }// fin Test ...
Le consol ne se lance pas ?? pkoi ? i
Tu as tenté un debuggage ?
Il faut mettre un point d'arrêt au début de ton main (avec F9 ?) et lancer le debug. En avançant 'pas à pas' tu devrais voir pourquoi il y a un soucis.
Je pense qu'elle se lance mais que le programme se termine trop vite pour la voir. en mettant un system("PAUSE"); avant la fin du main tu devrais la voir quelques soient les tests.
Sur ce, je rentre à ma maison ! ☺
M.
Il faut mettre un point d'arrêt au début de ton main (avec F9 ?) et lancer le debug. En avançant 'pas à pas' tu devrais voir pourquoi il y a un soucis.
Je pense qu'elle se lance mais que le programme se termine trop vite pour la voir. en mettant un system("PAUSE"); avant la fin du main tu devrais la voir quelques soient les tests.
Sur ce, je rentre à ma maison ! ☺
M.
Ayé j'ai reussi il fallait que je "caste" le string "test" avant de les comparer comme ceci :
Ouf enfin Merci bcp
string s = "--test"; const char *Str2 = s.c_str ();
Ouf enfin Merci bcp
Tiens oui...
if(argv[1]=="--test")
et
if( strcmp( argv[1], "--test" ) == 0 )
Le premier compare les pointeurs, le deuxième compare les chaînes de caractères.
char s1[] = "bonjour";
char s2[] = "bonjour";
if ( s1 == s2 ) -> faux (ou dépend des options de compilation)
if( strcmp( s1, s2 ) == 0 ) -> toujours vrai pour tous les compilateurs ou systèmes d'exploitation.
strcmp est une fonction standard du C. Déclarée dans string.h
M.
if(argv[1]=="--test")
et
if( strcmp( argv[1], "--test" ) == 0 )
Le premier compare les pointeurs, le deuxième compare les chaînes de caractères.
char s1[] = "bonjour";
char s2[] = "bonjour";
if ( s1 == s2 ) -> faux (ou dépend des options de compilation)
if( strcmp( s1, s2 ) == 0 ) -> toujours vrai pour tous les compilateurs ou systèmes d'exploitation.
strcmp est une fonction standard du C. Déclarée dans string.h
M.
Salut.
C'est une bonne chose que d'utiliser les std::string plutôt que les const char*, ça évite les erreurs de pointeur, surtout venant du Java ;)
Je te conseil pour tes problème de compilation, avant de revenir à DevCpp de faire un peu de compilation en mode console, histoire de comprendre ce qui se passe.
Si un symbole n'est pas trouvé, dans la plupart des cas, c'est que tu ne lui a pas donnée.
C'est une bonne chose que d'utiliser les std::string plutôt que les const char*, ça évite les erreurs de pointeur, surtout venant du Java ;)
Je te conseil pour tes problème de compilation, avant de revenir à DevCpp de faire un peu de compilation en mode console, histoire de comprendre ce qui se passe.
Si un symbole n'est pas trouvé, dans la plupart des cas, c'est que tu ne lui a pas donnée.
en type int (n1/n2) ca ne marcherait pas (pas a chaque fois)!
13/4 = 3
6/4 = 1
4/6 = 0
4/13 = 0
Pour rester logique tout de même je mettrais des unsigned int ou un size_t en valeur de retour et je casterais pour le calcul du taux.
Enfin le problème c'est le link, donc j'attends de voir le header.
M.