C++ Probleme de Lien entre classes

Résolu/Fermé
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 - 27 mars 2008 à 11:02
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 28 mars 2008 à 14:08
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****

#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

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 11:29
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 11:39
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)!
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125 > velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011
27 mars 2008 à 12:00
Effectivement pour un taux avec les int...
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10 > Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010
27 mars 2008 à 12:04
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

0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 12:47
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 12:52
Sisi j'ai choisi de ne pas le mettre ici car car il n'influait pas dans la classe test...

Peut etre en mettant les variables nbmot et position en public je vais tester (beurrrrg mais bon... lol)
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 12:58
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
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 13:07
As-tu testé le pouet ?

Y a-t-il un fichier .o ou .obj de produit pour ListeMot ?

Quel est le compilo ?

M.
0

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

Posez votre question
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 13:15
pouet ?? oui il ya un "Liste.o" généré quand j'ai compilé puis j'ai compilé "test" sniff ca commence a...grrr
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 13:31
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 15:57
Dsl Miam Miam...lol
J'utilise devcpp dans lequel je travaille depuis ma clé (coté pratique ^_^)
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 16:42
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 16:49
Il n'y a pas de test.exe ?? et g++ n'est pas installé (en dur) dans les machines de cette école
je suis un peu dans le kaka !
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 17:10
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
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 17:20
-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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 17:23
exact dans "D:\Dev-Cpp\Packages" il ya gcc-g++.entry et gcc-core.entry lequel des 2?

Pour le fichier de projet c'est okay ?
: j'ai pas compris
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 17:46
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 17:50
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
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 17:54
Deja ca compile sans probleme de link... suspens lol
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 18:09
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
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 18:18
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.
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 18:23
Bonne soirée encore merci !
0
velderama Messages postés 199 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 11 mai 2011 10
27 mars 2008 à 19:13
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
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
27 mars 2008 à 19:36
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 mars 2008 à 14:08
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.
0