Erreur de compilation string dans header

Résolu
madhack
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017
- Modifié par cptpingu le 13/02/2017 à 11:41
madhack
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017
- 20 févr. 2017 à 23:39
Bonjour.

Comme indiqué dans le titre j'ai deux erreurs de compilation dans le code qui suit :

main.cpp
#include <iostream>
#include <ctime>//peut etre inutile si dans le header 
#include <cstdlib>//idem
#include <string>//idem

#include "melangersLettre.h"
using namespace std;

int main()
{
    string motMystere,motMelange,motUtilisateur;
    srand(time(0));
    cout<<"Veuillez saissire le mot : "<<endl;
    cin>>motMystere;
    motMelange=melangersLettre(motMystere);
    cout<<motMelange<<endl;
    return 0;
}


melangerLettre.cpp
#include "melangersLettre.h"

string melangersLettre(string mot)
{
    int position;
    string melange;
    while(mot.size()!=0)
    {
        position=rand()%mot.size();
        melange+=mot[position];
        mot.erase(position,1);
    }
        return melange;
}


melangersLettre.h
#ifndef MELANGERSLETTRE_H_INCLUDED
#define MELANGERSLETTRE_H_INCLUDED
#include<string>
#include<ctime>
#include<cstdlib>

string melangersLettre(std::string mot);

#endif // MELANGERSLETTRE_H_INCLUDED


et ici la synthese du compilateur

||=== Build: Debug in motMystere (compiler: GNU GCC Compiler) ===|
E:\projetc++\formation2017\openclassroom\les bases c++chap1a9\tp\essaitp\motMystere\melangersLettre.h|7|error: 'string' does not name a type|
E:\projetc++\formation2017\openclassroom\les bases c++chap1a9\tp\essaitp\motMystere\main.cpp||In function 'int main()'
E:\projetc++\formation2017\openclassroom\les bases c++chap1a9\tp\essaitp\motMystere\main.cpp|14|error: 'melangersLettre' was not declared in this scope|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


Si je compile le programme dans un seul fichier .cpp cela fonctione .

Je vous remercie d'avance

4 réponses

cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Modifié par cptpingu le 13/02/2017 à 17:45
Bonjour.

Évite les using namespace std, c'est ultra dégueux, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
Ton souci, est dû à cette directive, puisque celle-ci se "répand" en fonction de la manière dont tu inclus tes headers.
Je te conseille fortement d'écrire std::string plutôt que string, et de virer complètement cette directive. Lis bien le lien que je t'ai donné pour comprendre pouquoi il ne faut jamais utiliser de using namespace.

Deux-trois conseils:
  • Un header C++, a pour extension .hh ou .hpp mais pas .h (c'est plus pour du C).
  • Plutôt que de faire mot.size() != 0, préfère !mot.empty()
  • Si tu dois mélanger des lettres plutôt que d'ajouter un caractère et en supprimer un (ce qui est très moche), échange les via std::swap ! Ça t'évitera en plus de devoir créer une variable intermédiaire (tu peux directement travailler sur "mot").



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
madhack
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017

13 févr. 2017 à 18:58
Merci pour le conseil je verrais pour réécrire intégralement mon code sans le namespacestd.
Toutefois changer en std::string ne change pas mon erreur de compilation.
il est donc conseiller d'introduire les fonctions utilisées en
include <iostream>

int main()
{
using std::hex;
using std::cout;
using std::endl;

dans chaque "bloque" de fonction développé.
Mais pour le header je ne vois pas ou intégrer ces using
0
cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
Modifié par cptpingu le 14/02/2017 à 10:47
Je ne suis pas d'accord avec ton raisonnement. Si tu préfixes par std::, ça fonctionnera...
Rien de bien difficile que d'ajouter ce qui manque...

main.cpp
#include "melangersLettre.hh"

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>

int main()
{
    std::string motMystere;
    srand(time(0));
    std::cout << "Veuillez saisir le mot : " << std::endl;
    std::cin >> motMystere;
    std::string motMelange = melangersLettre(motMystere);
    std::cout << motMelange << std::endl;

    return 0;
}


melangerLettre.cpp
#include "melangersLettre.hh"

#include <cstdlib>

std::string melangersLettre(std::string mot)
{
    std::string melange;
    while (!mot.empty())
    {
        int position = rand() % mot.size();
        melange += mot[position];
        mot.erase(position, 1);
    }

    return melange;
}


melangersLettre.hh
#ifndef MELANGERSLETTRE_HH
# define MELANGERSLETTRE_HH

# include <string>

std::string melangersLettre(std::string mot);

#endif // MELANGERSLETTRE_HH



Un algo un peu plus "propre":
// Penser à ajouter #include <algorithm> pour utiliser std::swap

// Fonctionnement:
// On interverti le dernier caractère avec n'importe quel caractère précédent.
// On recule le curseur d'une case, et on recommence à intervertir cette position avec n'importe quel caractère précédent.
// Quand on a arrive au début de la chaîne, alors toutes les lettres ont forcément été mélangées.
std::string melangersLettre(std::string mot)
{
    for (int i = mot.size() - 1; i > 0; --i) // On mélange autant de fois qu'il y a de caractères
    {
        int position = rand() % (i + 1);
        std::swap(mot[i], mot[position]);
    }

    return mot;
}


A noter qu'on pourrait carrément utiliser std::random_shuffle qui est outil pour "mélanger":
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string motMystere;
    std::cout << "Veuillez saisir le mot : " << std::endl;
    std::cin >> motMystere;
    std::random_shuffle(motMystere.begin(), motMystere.end());
    std::cout << motMystere << std::endl;

    return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
madhack
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017

Modifié par madhack le 20/02/2017 à 23:49
Bonjour.
Merci pour l'ensemble de ces informations.
Je suis un newbiz donc je suis très loin de connaitre toutes les commandes ou bibliothèque du langage.
Je vais mettre mes std:: de suite et passer le fil en résolu
Merci beaucoup pour le temps que vous m'avez accordé.
J'ai fait les modification et tout est ok pour le compilateur.
0