FORUM Tom's Hardware » Programmation » C / C++ / Java » perte initialisation variable C++
 

perte initialisation variable C++

Il y a 286 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : perte initialisation variable C++
 
Plus d'informations

Bonjour, alors voici mon pb :
 
pDecrypter = new Computer(duplicates)
un nouvel objet de type Computer est créé
Computer::Computer(bool dupes):
Decrypter(dupes), total(0), mySmartString(0)
 
{
}
cela appelle constr Decrypter::Decrypter(bool dupes):
round(0),
duplicates (dupes)
{
}
 
et mySmartString est initialisé à 0
 
Ensuite il ya pDecrypter->Play();
A ce moment là pdecrypter affiche seulement les variables protected(de la classe DECRYPTER)
cependant il va bien dans Computer::Play
if (!mySmartString)
      mySmartString = new SmartString(duplicates);
et là je me rends compte avec stupéfaction que mySmartString est rempli avec n'importe quoi!!! et ça me plante tout!! segmentation defaultPouvez vous m'aider et me dire ce qui s'est passé.
La variable total contient également n'importe quoi
 
D'autre part comment peut on initialiser un pointeur à 0 sans avoir appelé le constructeur?
 
 
Voici le code
la classe game.hpp
 

Code :
  1. #ifndef GAME_HPP
  2. #define GAME_HPP
  3. #include "defvals.hpp"
  4. #include "Gues1205.hpp"
  5. #include "SmartString1201.hpp"
  6. class Guess;
  7. class Decrypter;
  8. class Game
  9. {
  10. public:
  11.     Game();
  12.     ~Game()     {}
  13.      void Play();
  14.      static int howManyLetters;
  15.      static int howManyPositions;
  16. private:
  17.      void DisplayTime(int secs);
  18.      bool VerifyComputerChoices();
  19.      bool duplicates;
  20.      Decrypter *  pDecrypter;
  21. };
  22. #endif


 
la classe Decrypter.hpp

Code :
  1. #ifndef DECRYP_HPP
  2. #define DECRYP_HPP
  3. #include "defvals.hpp"
  4. #include "Gues1205.hpp"
  5. class Decrypter
  6. {
  7. public:
  8.    Decrypter(bool duplicates);
  9.    virtual ~Decrypter();
  10.   void Display( vector<char> charVec) const;
  11.   virtual bool HandleFlag(char flag) = 0 ;
  12.   virtual void Play() = 0 ;
  13.   virtual void ShowHelp() = 0;
  14.   void ShowHistory();
  15. protected:
  16.    bool duplicates;
  17.    vector<Guess> history;
  18.    int round;
  19. };
  20. #endif


la classe computer.hpp
 

Code :
  1. #ifndef COMPUTER_HPP
  2. #define COMPUTER_HPP
  3. #include "decrypter1101.hpp"
  4. class SmartString;
  5. class Computer : public Decrypter
  6. {
  7. public:
  8.    Computer (bool duplicates);
  9.    virtual ~Computer();
  10.    bool HandleFlag(char flag);
  11.    void Play() ;
  12. private:
  13.    void GenerateAGuess();
  14.    bool IsConsistent(vector<char> guess);
  15.    Guess OfferGuess();
  16.    void ShowHelp();
  17.    SmartString * mySmartString;
  18.    int total;
  19. };
  20. #endif

XHTML 1.1 certified
Plus d'informations

J'ai relu plusieurs fois ton post et impossible de comprendre.
 
Le seul truc que qui me choque dans ton code c'est les forward declaration des classes ... (bonjour le typage ...)
 
Dans ton computer.hpp par exemple tu fais une déclaration de la class SmartString mais elle n'est pas défini (sinon tu n'aurai pas a faire la déclaration) donc le compilo sera incapable de faire son boulot proprement.
 
Bref, vire la déclaration de la class et fait un include du header de la classe SmartString.  
Au passage, je te conseille fortement de lire les coding standard (http://www.possibility.com/Cpp/CppCodingStandard.html)qui stipulent que quand un objet a besoin de l'include d'un autre objet, il faut systématiquement le mettre dans son .hpp et cela même s'il sera inclu en amont par un autre header.
 
Cette erreur est présente dans les autres classes que tu nous montre.
 
Personnellement, les seule fois ou je fais des forward declaration c'est quand j'ai besoin de définir des fonction callback static avec un typedef avant de définir une classe.

Plus d'informations

ok merci mais effectivement quelle est la différence entre mettre le header et mettre la class? je n'ai pas bien saisi
D'autre part, ça ne résout en rien mon pb pourquoi je pers les données private de computer?

XHTML 1.1 certified
Plus d'informations

Tu ne perd pas de données ...
 
C'est juste que ton compilo ne sais pas instancer correctement SmartString car il n'a pas eu la définition complète.
 


Message édité par Rodolphe le 14-01-2005 à 00:43:25
XHTML 1.1 certified
Plus d'informations

Pour le coup des headers :
 
Ta classe Computer dérive de Decrypter donc Computer à besoin de connaître de quoi est constitué la classe Decrypter (variables, méthodes, enum ...) c'est pour ça que tu inclu le fichier decrypter1101.hpp.
 
Et bien c'est pareil pour la classe SmartString, Computer a besoin de savoir de quoi est constitué cette classe donc il faut que tu mettes une directive #include "SmartString.hpp"

Plus d'informations

alors en fait j'ai mis le include smartstring mais celui-ci était présent dans computer.cpp.Même avec ça ça ne change rien.
En fait juste avant la ligne pDecrypter->Play (qui est dans game.cpp), pDecrypter est considéré alors comme un objet de type DECRYPTER avec la definition de DECRYPTER ( c normal qu'il ne soit pas considéré comme computer?)et quand je me debranche dans COMPUTER :: PLAY, alors le pointeur this est considéré comme un objet COMPUTER mais là "smartstring" ET "total" sont initialisés avec n'importe quoi.
Donc, ça n'a rien changé!!


Message édité par smag le 14-01-2005 à 13:30:02
XHTML 1.1 certified
Plus d'informations

Si tu mettais le code de tes classes ... pasque la juste avec les headers on ne peut rien faire ...

XHTML 1.1 certified
Plus d'informations

Je viens de relire ton message précédent.
Tu m'as tout l'air de tenter d'utiliser une variable dans le scope de Computer par le biais d'un objet Decrypter (je me demande bien comment ça compile ... mais bon ..)
 
Bref, si tu veux une confirmation, montre moi ton code ...

Plus d'informations

Je m'excuse pour cette bonne grosse question de newb... Mais ca sert à quoi un hpp ? c'est la contraction entre un .h et un .cpp ? C'est quoi l'intéret par rapport à une compilation séparée classique ?

Profil : Pointeur
Plus d'informations

c'est la meme chose qu'un fichier .h :o
au fait tu peux donner l'extention que tu veux... mais bon autant respecter les standard :D


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Laquelle? ;-)
Plus d'informations

D'apres ce que j'ai pu voir, mySmartString est un pointeur.
Donc si tu veux tester s'il est initialise, tu testes si le pointeur est NULL et pas s'il vaut 0.
 
Au depart tu fais donc :

Code :
  1. mySmartString = NULL;


 
Et ton if devient :

Code :
  1. if(mySmartString == NULL) mySmartString(duplicates);

Plus d'informations

Rodolphe a écrit :

Je viens de relire ton message précédent.
Tu m'as tout l'air de tenter d'utiliser une variable dans le scope de Computer par le biais d'un objet Decrypter (je me demande bien comment ça compile ... mais bon ..)
 
Bref, si tu veux une confirmation, montre moi ton code ...


 
J'étais partie en vacances.
Effectivement, l'erreur viendrait plutôt de là sachant que je pers également ma deuxième variable membre total ( indépendant de SmartString).Mais les classes human et computer sont des classes dérivées de Decrypter.
 
Voici le code en totalité:
 
1a) la classe Game

Code :
  1. #ifndef GAME_HPP
  2. #define GAME_HPP
  3. #include "defvals.hpp"
  4. #include "Gues1205.hpp"
  5. #include "SmartString1201.hpp"
  6. class Guess;
  7. class Decrypter;
  8. class Game
  9. {
  10. public:
  11.     Game();
  12.     ~Game()     {}
  13.      void Play();
  14.      static int howManyLetters;
  15.      static int howManyPositions;
  16. private:
  17.      void DisplayTime(int secs);
  18.      bool VerifyComputerChoices();
  19.      bool duplicates;
  20.      Decrypter *  pDecrypter;
  21. };
  22. #endif


1b) l'implémentation de la classe Game

Code :
  1. #include "game1103.hpp"
  2. #include "defvals.hpp"
  3. #include "decrypter1101.hpp"
  4. #include "human1105.hpp"
  5. #include "computer1109.hpp"
  6. #include "SmartString1201.hpp"
  7. #include<time.h>
  8. #include<windows.h>
  9. using namespace std;
  10. char * Accent(const char * mess) {
  11. static char retour [80];
  12. CharToOem (mess,retour);
  13. return retour;
  14.    }
  15. int Game::howManyLetters = 0;
  16. int Game::howManyPositions = 0 ;
  17. Game::Game()
  18. {
  19.    for( ;; )
  20.    {
  21.       // Récupération du choix de l'utilisateur
  22.       // pour le nombre de lettres possible
  23.       while (howManyLetters < minLetters
  24.          || howManyLetters > maxLetters)
  25.       {
  26.         cout << "Nombre de lettres ? (";
  27.         cout << minLetters << "-" << maxLetters << " ) : ";
  28.         cin >> howManyLetters;
  29.         if ( howManyLetters < minLetters
  30.            || howManyLetters > maxLetters)
  31.         {
  32.            cout << "Veuillez saisir un nombre compris entre ";
  33.            cout << minLetters <<" et " << maxLetters <<endl;
  34.         }
  35.       }
  36.       // Récupération du choix de l'utilisateur
  37.       // pour le nombre de positions
  38.       while (howManyPositions < minPos
  39.          || howManyPositions > maxPos)
  40.       {
  41.          cout << "Nombre de positions ? (";
  42.          cout << minPos << "-" << maxPos << " ) : ";
  43.          cin >> howManyPositions;
  44.          if ( howManyPositions < minPos
  45.           ||  howManyPositions > maxPos)
  46.          {
  47.             cout << "Veuillez saisir un nombre de positions compris entre ";
  48.             cout << minPos << " et " << maxPos << endl;
  49.          }
  50.        }
  51.        char choice = ' ';
  52.        while ( choice != 'o' && choice != 'n' )
  53.        {
  54.          cout << "Permettre les doublons (o/n) ? ";
  55.          cin >> choice;
  56.        }
  57.        duplicates = choice == 'o'? true: false;
  58.        if ( ! duplicates
  59.          && howManyPositions > howManyLetters)
  60.        {
  61.           cout << "Impossible de mettre " << howManyLetters << " lettres dans ";
  62.           cout << howManyPositions << " positions sans doublons !\n";
  63.           cout << Accent("Essayez à nouveau ... \n" );
  64.           howManyLetters = 0; howManyPositions = 0 ;
  65.           continue;
  66.        }
  67.        choice = ' ';
  68.        while( choice!= 'h' && choice != 'c' )
  69.        {
  70.          cout << "Qui devine. (H)umain";
  71.          cout << " ou (C)alculateur ? (h/c)? ";
  72.          cin >> choice;
  73.        }
  74.        bool ok = choice == 'h' ?
  75.          true : VerifyComputerChoices();
  76.        if (ok)
  77.        {
  78.            if (choice == 'h')
  79.              pDecrypter = new Human(duplicates);
  80.            else
  81.              pDecrypter = new Computer(duplicates);
  82.            break;
  83.        }
  84.     }
  85. }
  86. void Game::DisplayTime(int totalSeconds)
  87. {
  88.    int totalDays = totalSeconds / SecondsInDay;
  89.     int totalHours = totalSeconds / SecondsInHour;
  90.      int totalMinutes = totalSeconds / SecondsInMinute;
  91.      if ( totalDays > 1)
  92.       cout << totalDays << " jours ! " ;
  93.       else
  94.        if ( totalHours > 1)
  95.       cout << totalHours << " heures ! " ;
  96.       else
  97.        if ( totalMinutes > 1)
  98.       cout << totalMinutes << " minutes . " ;
  99.       else
  100.       cout << totalSeconds << " secondes. " ;
  101. }
  102. void Game::Play()
  103. {
  104. int start = time (NULL );
  105. pDecrypter->Play();
  106. //indique le temps passé
  107. int end = time(NULL );
  108. int totalSeconds = end - start;
  109. cout << "\nTemps total passé, pour ce jeu : ";
  110. DisplayTime(totalSeconds);
  111. cout <<"\n";
  112. howManyLetters = 0;
  113. howManyPositions = 0;
  114. }
  115. bool Game::VerifyComputerChoices()
  116. {
  117.   int totalGuesses = 1;
  118.   if (duplicates)
  119.     for(int i = 0; i < howManyPositions;i++)
  120.        totalGuesses *=howManyLetters;
  121.   else
  122.      for ( int i = howManyLetters; i > howManyLetters - howManyPositions;
  123.              i-- )
  124.          totalGuesses *=i;
  125.   int totalSeconds = totalGuesses/GUESSES_PER_SECOND;
  126.   if (totalSeconds > 2)
  127.   {
  128.    cout << "\n\nVous me demandez de deviner ";
  129.    cout << "parmi ";
  130.    cout << totalGuesses;
  131.    cout << " combinaisons possibles. " ;
  132.    cout << "\nJe peux venir à bout d'environ ";
  133.    cout << GUESSES_PER_SECOND;
  134.    cout << " combinaisons par seconde. ";
  135.    cout << Accent("Si l'énigme est difficile, " );
  136.    cout << "\nune seule proposition peut me prendre plus de ";
  137.    DisplayTime(totalSeconds);
  138.    char confirm = ' ';
  139.    while ( confirm != 'o' && confirm != 'n')
  140.    {
  141.      cout << Accent("\n\nEtes-vous sûr de vouloir continuer (o/n) ? " );
  142.      cin >> confirm;
  143.    }
  144.     if (confirm == 'n')
  145.     {
  146.       howManyLetters = 0 ;
  147.       howManyPositions = 0 ;
  148.       return false;
  149.     }
  150.   }
  151.   else
  152.   {
  153.     cout <<"Choix parmi " << totalGuesses;
  154.     cout << " combinaisons possibles...\n\n";
  155.   }
  156.   return true;
  157. }


 
2a) la classe Computer

Code :
  1. #ifndef COMPUTER_HPP
  2. #define COMPUTER_HPP
  3. #include "SmartString1201.hpp"
  4. #include "decrypter1101.hpp"
  5. class SmartString;
  6. class Computer : public Decrypter
  7. {
  8. public:
  9.    Computer (bool duplicates);
  10.    virtual ~Computer();
  11.    bool HandleFlag(char flag);
  12.    void Play() ;
  13. private:
  14.    void GenerateAGuess();
  15.    bool IsConsistent(vector<char> guess);
  16.    Guess OfferGuess();
  17.    void ShowHelp();
  18.    SmartString * mySmartString;
  19.    int total;
  20. };
  21. #endif


2b) l'implémentation de la classe Computer

Code :
  1. #include "computer1109.hpp"
  2. #include "game1103.hpp"
  3. #include "SmartString1201.hpp"
  4. #include<windows.h>
  5. using namespace std;
  6. char * AccentC(const char * mess) {
  7. static char retour [80];
  8. CharToOem (mess,retour);
  9. return retour;
  10.    }
  11. Computer::Computer(bool dupes):
  12. Decrypter(dupes), total(0), mySmartString(0)
  13. {
  14. }
  15. Computer :: ~Computer()
  16. {
  17. }
  18. void Computer::GenerateAGuess()
  19. {
  20.    bool ok = true;
  21.    int counter = 0;
  22.    int start = time(NULL );
  23.    do
  24.    {
  25.      counter++;
  26.      total++;
  27.      if (counter % 10000 == 00)
  28.        cout << ".";
  29.      ok = mySmartString->GetNext();
  30.      if (!ok)
  31.       {
  32.         cout << "Quelquechose ne va pas !";
  33.         cout << " Recommencez\n";
  34.         round = 0;
  35.         delete mySmartString;
  36.         mySmartString = new SmartString(duplicates);
  37.         ShowHistory();
  38.         cout <<"\n\n";
  39.         history.clear();
  40.         continue;
  41.        }
  42.    } while ( !IsConsistent(mySmartString->GetString()) );
  43.    int end = time(NULL );
  44.    int seconds = end-start;
  45.    cout << "(" << counter;
  46.    cout << AccentC(" chaînes éliminées pour ce tour ; " );
  47.    cout << total << " total.)";
  48.    if (seconds > 1)
  49.       cout << "(" << seconds << " secondes]";
  50.       cout << "\n";
  51. }
  52. // Gestion des indicateurs de l'utilisateur ( -?,-<, etc.)
  53. bool Computer::HandleFlag(char flag)
  54. {
  55.     bool quit =false;
  56.     switch (flag)
  57.     {
  58.          case 's':
  59.         ShowHistory();
  60.         break;
  61.          case '?':
  62.         ShowHelp();
  63.         break;
  64.          case 'q':
  65.         quit = true;
  66.         break;
  67.         default:
  68.         cout << AccentC(  "\nIndicateur inconnu.Ignoré.\n" );
  69.         break;
  70.     }
  71.     return quit ;
  72. }
  73. bool Computer::IsConsistent(vector<char> theGuess)
  74. {
  75.    if (!duplicates)
  76.    {
  77.      for(
  78.         vector<char>::const_iterator it =
  79.                  theGuess.begin();
  80.              it!= theGuess.end();
  81.              it++)
  82.      {
  83.        int HowMany =
  84.            count(theGuess.begin(),theGuess.end(), *it);
  85.            if (HowMany > 1)
  86.            return false;
  87.      }
  88.    }
  89.    bool isValid = true ;
  90.    int correct;
  91.    int position;
  92.    for ( vector<Guess>::const_iterator it=
  93.                      history.begin();
  94.                   it != history.end();
  95.                           it++)
  96.        {
  97.         vector <char> temp = it->GetString();
  98.         correct = 0;
  99.         position = 0;
  100.         for(int i = 0; i < Game::howManyLetters; i++)
  101.           {
  102.             int howManyInGuess =
  103.               count (theGuess.begin(),theGuess.end(),alpha[i]);
  104.             int howManyInAnswer =
  105.               count (temp.begin(),temp.end(),alpha[i]);
  106.             correct += min (howManyInGuess,howManyInAnswer);
  107.            }
  108.          for(int i = 0; i < Game::howManyPositions; i++)
  109.           {
  110.             if ( theGuess[i] = temp[i])
  111.              position ++;
  112.           }
  113.          if ( correct != it->GetScore().first ||
  114.                  position != it->GetScore().second )
  115.              {
  116.                isValid = false;
  117.                break;
  118.              }
  119.        }
  120.        return isValid;
  121. }
  122. Guess Computer::OfferGuess()
  123. {
  124.   vector<char> theGuess =
  125.     mySmartString->GetString();
  126.     round++;
  127.     int numCorrect, numInPosition;
  128.     cout <<"\n";
  129.     Display(theGuess);
  130.     cout << "Essai " << round << ". ";
  131.     cout << "Veuillez donner le score. \t";
  132.     cout << "Combien sont correctes ? ";
  133.     cin >> numCorrect;
  134.     cout << AccentC("\t\t\tVombien sont bien placées ?: " );
  135.     cin >> numInPosition;
  136.     Guess thisGuess(theGuess, numCorrect, numInPosition);
  137.     return thisGuess;
  138. }
  139. void Computer::Play()
  140. {
  141.    if (!mySmartString)
  142.       mySmartString = new SmartString(duplicates);
  143.    vector<char> theGuess;
  144.    history.clear();
  145.    bool deletedCharacters = false;
  146.    for (;;)
  147.    {
  148.       Guess theGuess = OfferGuess();
  149.       history.push_back(theGuess);
  150.        if ( theGuess.GetScore().second ==
  151.             Game::howManyPositions)
  152.            break;
  153.        if (
  154.             ! mySmartString->CanEliminateCharacters(theGuess)  ||
  155.             ! IsConsistent(mySmartString->GetString())
  156.            )
  157.               GenerateAGuess();
  158.     };
  159. }
  160. // Le joueur a entré -?
  161. void Computer::ShowHelp()
  162. {
  163.    cout << "\t-h Indice\n\t-s Afficher l'historique \n";
  164.    cout << "\t-? Aide\n\t-q Quitter\n" << endl;
  165. }


 
 
3a) la classe Human

Code :
  1. #ifndef HUMAN_HPP
  2. #define HUMAN_HPP
  3. #include "decrypter1101.hpp"
  4. class Human : public Decrypter
  5. {
  6. public:
  7.    Human (bool duplicates);
  8.    virtual ~Human();
  9.   vector<char> GetSolution() const;
  10.   bool HandleFlag(char flag);
  11.   bool IsValid (char c) const;
  12.   void Play() ;
  13.   void Score( vector<char> thisGuess, int & correct, int & position);
  14. private:
  15.    void ShowHelp();
  16.    void ShowHint();
  17.    int hintCtr;
  18.    vector<char> solution;
  19. };
  20. #endif


3b) l'implémentation de la classe Human

Code :
  1. #include "human1105.hpp"
  2. #include "game1103.hpp"
  3. #include<string>
  4. #include<windows.h>
  5. using namespace std;
  6. char * AccentH(const char * mess) {
  7. static char retour [80];
  8. CharToOem (mess,retour);
  9. return retour;
  10.    }
  11. Human::Human(bool dupes):
  12. Decrypter(dupes), hintCtr(0)
  13. {
  14. }
  15. Human :: ~Human()
  16. {
  17. }
  18. vector <char> Human::GetSolution() const
  19. {
  20. return solution;
  21. }
  22. // Gestion des indicateurs de l'utilisateur ( -?,-<, etc.)
  23. bool Human::HandleFlag(char flag)
  24. {
  25.     bool quit =false;
  26.     switch (flag)
  27.     {
  28.       case 'h':
  29.         ShowHint();
  30.         break;
  31.          case 's':
  32.         ShowHistory();
  33.         break;
  34.          case '?':
  35.         ShowHelp();
  36.         break;
  37.          case '!':
  38.         Display(GetSolution());
  39.         break;
  40.          case 'q':
  41.         quit = true;
  42.         break;
  43.         default:
  44.         cout << AccentH(  "\nIndicateur inconnu.Ignoré.\n" );
  45.         break;
  46.     }
  47.     return quit ;
  48. }
  49. bool Human::IsValid(char c) const
  50. {
  51. bool IsValid = false;
  52. for (int i = 0 ; i < Game::howManyLetters ; i++)
  53.         if (alpha[i]== c)
  54.         IsValid = true;
  55.   return IsValid;
  56. }
  57. void Human::Play()
  58. {
  59. vector<char> thisGuess;
  60. int correct = 0;
  61. int position = 0;
  62. bool quit = false;
  63. round ++;
  64. // alimentation du tableau solution
  65.    srand( (unsigned) time (NULL) );
  66.    for ( int i = 0 ; i < Game::howManyPositions;)
  67.        { int nextValue = rand () % (Game::howManyLetters);
  68.          char theChar = alpha[nextValue];
  69.          // lettre déjà existante?
  70.           if ( ! duplicates && i > 0 )
  71.           {
  72.             vector<char>::iterator where =
  73.               find(solution.begin(), solution.end(), theChar);
  74.               if (where != solution.end())
  75.                 continue;
  76.           }
  77.           solution.push_back(theChar);
  78.          i++;
  79.        }
  80.   while ( position < Game::howManyPositions)
  81.    {
  82.      thisGuess.clear();
  83.      string guess;
  84.      cout << "\nEssai " << round << ". Entrez -? ou ";
  85.      cout << Game::howManyPositions << " lettres entre ";
  86.      cout << alpha[0] << " et " << alpha[Game::howManyLetters-1] << " : ";
  87.      cin >> guess ;
  88.      if (guess[0] == '-')//c'est un indicateur
  89.       {
  90.         quit = HandleFlag(guess[1]);
  91.         if(quit)
  92.           break;
  93.           continue;
  94.       }
  95.      if ( guess.length() < Game::howManyPositions)
  96.       {
  97.         cout << "\n ** Veuillez entrer exactement " ;
  98.         cout << Game::howManyPositions << " lettres . ** \n";
  99.         continue;
  100.       }
  101.      bool lineIsValid = true;
  102.      for (int i = 0; i < Game::howManyPositions; i++)
  103.          {
  104.           lineIsValid = IsValid(guess[i]);
  105.           if ( ! lineIsValid)
  106.            break;
  107.          }
  108.      //création de la proposition pour l'affichage
  109.      if (lineIsValid)
  110.        for ( int i =0; i < Game::howManyPositions; i++)
  111.            thisGuess.push_back(guess[i]);
  112.      else
  113.         {
  114.          cout << "Veuillez entre uniquement des lettres entre ";
  115.          cout << alpha[0] << " et " << alpha[Game::howManyLetters-1] << "\n";
  116.          continue;
  117.         }
  118.        round++ ;
  119.      cout << "\nVotre proposition : ";
  120.      Display(thisGuess);
  121.      //calcul et affichage
  122.      Score(thisGuess,correct,position);
  123.      cout << "\t\t" << correct  << " correcte(s), ";
  124.      cout << position << AccentH( " bien placee(s) \n" );
  125.      // création d'un enregistrement et sauvegarde dans le vector history
  126.      Guess thisRound(thisGuess,correct,position);
  127.      history.push_back(thisRound);
  128.   }
  129.   if(!quit)
  130.   {
  131.     cout << "\nFelicitations ! Il vous a fallu ";
  132.     if (round <= 6)
  133.       cout <<  " seulement " ;
  134.       if (round-1 == 1)
  135.         cout << "un essai ! \n";
  136.     else
  137.       cout << round-1 << " essais. \n";
  138.    }
  139. }
  140. void Human::Score( vector<char> thisGuess, int &  correct, int & position)
  141.   {
  142.            correct  = 0;
  143.            position = 0;
  144.            // pour chaque lettre possible,
  145.            // combien sont dans la réponse et la proposition
  146.            for ( int i = 0; i < Game::howManyLetters; i++)
  147.              {
  148.              int  howManyinGuess = count ( thisGuess.begin(), thisGuess.end(),
  149.                                              alpha[i]) ;
  150.               int  howManyinAnswer = count(solution.begin(), solution.end(),
  151.                                              alpha [i]);
  152.               correct+= min(howManyinGuess,howManyinAnswer);
  153.               }
  154.             //Pour chaque proposition
  155.             // combien sont dans la solution
  156.             for ( int j = 0; j < Game::howManyPositions ;  j++)
  157.                 { if (thisGuess[j] == solution[j])
  158.                     position ++;
  159.                  }
  160.    }
  161. // Joueur humain, révéler cahque lettre une par une
  162. void Human::ShowHint()
  163. {
  164.    if (hintCtr<Game::howManyPositions)