C++ Probleme de Lien entre classes
Résolu
velderama
Messages postés
203
Statut
Membre
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 10112 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
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.-
Oui je suis daccord mais dans une autre classe je fait une division des 2 nombres de mots retourné (calcul de taux)
en type int (n1/n2) ca ne marcherait pas (pas a chaque fois)!- Ok le voila
#ifndef Liste_H #define Liste_H #include <iostream> #include <fstream> #include <string> using namespace std; class ListeMot { float nbmot; public: //le delimiteur entre les mots inline bool is_delim(char c); //Ouvre le fichier et //retourne le nombre d'enregistrement float lireFichier(ifstream &f); }; #endif
-
-
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. -
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 -
As-tu testé le pouet ?
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. -
Dsl Miam Miam...lol
J'utilise devcpp dans lequel je travaille depuis ma clé (coté pratique ^_^) -
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. -
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 -
-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 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.-
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
-
-
-
Tout est ok (plus ou moins )
#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. -
Ayé j'ai reussi il fallait que je "caste" le string "test" avant de les comparer comme ceci :
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. -
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.