madhack
Messages postés23Date d'inscriptionlundi 28 novembre 2016StatutMembreDernière intervention27 avril 2017
-
Modifié par cptpingu le 13/02/2017 à 11:41
madhack
Messages postés23Date d'inscriptionlundi 28 novembre 2016StatutMembreDernière intervention27 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;
}
||=== 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").
madhack
Messages postés23Date d'inscriptionlundi 28 novembre 2016StatutMembreDernière intervention27 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
// 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.