Erreur de compilation string dans header [Résolu]

madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - 13 févr. 2017 à 11:29 - Dernière réponse : madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

cptpingu 3785 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 mai 2018 Dernière intervention - Modifié par cptpingu le 13/02/2017 à 17:45
0
Utile
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
Commenter la réponse de cptpingu
madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - 13 févr. 2017 à 18:58
0
Utile
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
Commenter la réponse de madhack
cptpingu 3785 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 mai 2018 Dernière intervention - Modifié par cptpingu le 14/02/2017 à 10:47
0
Utile
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
Commenter la réponse de cptpingu
madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - Modifié par madhack le 20/02/2017 à 23:49
0
Utile
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.
Commenter la réponse de madhack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.