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;
}
||=== 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 .
É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").
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
// 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":
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.