Erreur "basic_string"

Fermé
lgslgs - 25 févr. 2019 à 19:55
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 - 27 févr. 2019 à 17:52
Bonjour,
Je suis entrain de faire de la programmation modulaire mais j'ai ceci comme erreur dans main.cpp
au niveau de l'appel de la fonction ChoisirMot "undifined reference to 'ChoisirMot(std::_cxxl::basic_string<char, std::char_traits<c...' "
C'ets la seule erreur que j'ai.

Voici mes trois fichiers
(main.cpp)
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "fonction.h"


using namespace std;

int main()
{
    int taille=20;
    string tab[taille]={"un", "deux", "cinq", "rouge", "membre", "conseil", "donner", "reponse", "etat", "son", "armement", "peu", "apres", "vacances", "annonce", "mercredi", "evident", "regime", "affirmer", "arme"};
    string mot_cache=ChoisirMot(tab, taille);
    cout << mot_cache;
    return 0;
}


(fonction.cpp)
#include "fonction.h"
#include <ctime>
#include <cstdlib>


using namespace std;

char GetCaractere()
{
    char lettre;
    cout << "Proposez une lettre:";
    cin >> lettre;
    return lettre;
}
int GetNombreAlleatoire(int min=1, int max=20)
{
    srand(time(NULL));
    return rand()%max;
}
string ChoisirMot(string mots[], int taille)
{
    int pos=GetNombreAlleatoire(1, 20);
    return mots[pos];
}


(fonction.h)
#include <iostream>
#include <string>

#ifndef FONCTION_H_INCLUDED
#define FONCTION_H_INCLUDED

char GetCaractere();
int GetNombreAlleatoire(int min, int max);
std::string ChoisirMot(std::string mots[], int taille);
void IntEtoile(std::string& mot);
bool TestCaractere(char lettre, std::string& mot, std::string motCache);
bool TestGagne(std::string mot);

#endif // FONCTION_H_INCLUDED

Aidez moi svp

1 réponse

[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 1 104
Modifié le 26 févr. 2019 à 11:12
Bonjour lgslgs,

Les erreurs "undefined reference to ..." sont des erreurs du linker. A ce stade là, la compilation de ce que tu as demandé à compiler s'est bien passée, mais l'éditeur de liaison ne sait pas fabriquer un exécutable avec les fichiers objet produits par la compilation, car certains font référence à des objets qu'ils ne trouve pas.

Compiles tu bien fonction.cpp et est-ce que tu passes bien le fichier objet fonction.o au linker ?

En ligne de commande, sous Linux :

$ g++ -Wall main.cpp fonction.cpp
$ ./a.out
evident

... pas d'erreur chez moi :-)

Sur un autre plan, tu ne devrais pas mettre l'initialisation du générateur de nombres pseudo aléatoires
srand(time(NULL));
dans ta fonction
GetNombreAlleatoire()
(note aussi que tu peux retirer un "L"), car si un jour tu décides d'appeler cette fonction plusieurs fois par seconde, elle renverra le même nombre (bien que cela ne soit pas spécifié par le standard du C,
time(NULL)
renvoie la date actuelle en général sous la forme du nombre de secondes depuis le 1er Janvier 1970, donc avec une résolution d'une seconde).

Dal
0
Bonjour,
J'utilise un IDE (codeblocks) pour compiler. Et sur la fonction GetNombreAlleatoire(), ça marche correctement car il me renvoie differents nombres
0
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 1 104
Modifié le 27 févr. 2019 à 11:00
si tu utilises Codeblocks, et que tes fichiers fonction.cpp et fonction.h ont correctement été ajoutés à ton projet, Codeblocks va gérer leur compilation et la liaison avec MinGW.

comment as-tu ajouté fonction.cpp et fonction.h à ton projet (il ne suffit pas de copier ces fichiers dans le répertoire où se trouve main.cpp, ou de faire
File - Open
) ?

pour créer des nouveaux fichiers sources ou entêtes rattachés à ton projet Codeblocks, tu dois utiliser
File - New... - File
et choisir le type de fichier à ajouter au projet en partant d'un fichier vierge. Ou, si le fichier existe déjà et que tu ne veux pas le créer, tu peux l'ajouter en faisant
Project - Add files ...
...

quand les fichiers sont rattachés au projet, les fichiers sources .cpp apparaissent dans l'arborescence de gauche dans un sous-dossier "Sources" avec main.cpp et les entêtes apparaissent dans un sous-dossier "Headers"

quelque chose similaire à cela (c'est un exemple C) :


Et sur la fonction GetNombreAlleatoire(), ça marche correctement car il me renvoie differents nombres

je suppose que tu considères qu'elle marche correctement parce que tu ne l'appelles pas plus d'une fois par seconde, comme j'ai essayé de te l'expliquer... essaye ceci :-)

for (int n = 0; n < 10; n++) {
   cout << "Nombre = " << GetNombreAlleatoire(1, 10) << endl;
}

"aléatoire" s'écrit avec un seul L
0
lgslgs Messages postés 6 Date d'inscription lundi 31 décembre 2018 Statut Membre Dernière intervention 2 mai 2019
27 févr. 2019 à 17:38
Bonjour,
C'est ce que j'ai
0
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 1 104
27 févr. 2019 à 17:43
hmm, ok, peux-tu faire
Build - Clean
puis
Build - Rebuild
et poster sur le forum le contenu intégral de l'onglet "Build log" ?
0
[Dal] Messages postés 6204 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 février 2025 1 104
27 févr. 2019 à 17:52
Dans
Project - Properties ...
, onglet
Build targets
est-ce que
fonction.cpp
est bien coché dans la fenêtre
Build target files
?
0