IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de pointeurs : valeur non enregistrée dans la variable initiale


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Problème de pointeurs : valeur non enregistrée dans la variable initiale
    Bonjour à tous.

    Voilà, plusieurs années de Java ont eu raison de mes aptitudes en pointeurs en C/C++.
    Je suis actuellement en train de créer un Motus en console (je le porterai peut-être plus tard sur SDL si nécessaire), et j'ai le problème suivant :

    Mon main appelle la fonction jeu() de ma classe Partie. Comme je souhaite qu'une partie finisse après avoir joué 10 mots, j'ai créé un tableau de 10 Mot, voici ce qui nous intéresse dans la classe Mot :

    Mot.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Mot
    {
        private :
            std::vector<std::string> tentatives;
        public :
            void ajouterTentative(std::string tentative);
            std::vector<std::string> getTentatives();
    };
     
    #endif
    Mot.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Mot::ajouterTentative(std::string tentative)
    {
        tentatives.push_back(tentative);
    }
     
    std::vector<std::string> Mot::getTentatives()
    {
        return tentatives;
    }
    Chaque mot contient un vecteur de tentatives (que j'affiche ainsi dans la grille de mots).
    Je reviens donc à ma fonction jeu() de ma classe Partie. Voici ce que je fais dans cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int nbMotsJoues = 0;
    Mot mots[10];
     
    while(nbMotsJoues < 10)
    {
       jouerMot(&mots[nbMotsJoues]);
    }
    Et dans ma fonction jouerMot() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void jouerMot(Mot * mot)
    {
        Mot motActuel = *mot;
        string motTente;
        // L'utilisateur rentre le mot qu'il souhaite
        motActuel.ajouterTentative(motTente);
        /** Le problème est là ! **/
        cout << motActuel.getTentatives().size() << endl;
    }
    Le problème est ici : à chaque mot tenté, size() de mon vecteur vaut 1. En fait, il ne contient que la valeur que je lui ai affectée dans la fonction et pas les anciennes. Je suppose donc un problème d'adressage mais que faire ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    Petite question: pourquoi tu n'ajoutes pas "motTente" directement au pointeur du mot?

    Ensuite je pense plutôt que ca vient un problème d'algo: tu crées 10 mots et tu fais un ajout de motTente à chacun de ces mots donc tu n'auras qu'un seul motTente par mot (ouf finit avec les mots )

    Edit: voici une correction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int nbMotsJoues = 0;
    Mot mots;
     
    while(nbMotsJoues < 10)
    {
       jouerMot(&mots);
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Points : 58
    Points
    58
    Par défaut
    Salut,
    Le problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Mot motActuel = *mot;
    tu recrée un nouveau mot à chaque fois, un passage par référence au lieu de pointeur devrait résoudre le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void jouerMot(Mot& mot)
    {
        string motTente;
        // L'utilisateur rentre le mot qu'il souhaite
        mot.ajouterTentative(motTente);
        /** Le problème est là ! **/
        cout << mot.getTentatives().size() << endl;
    }
    ou garder le pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void jouerMot(Mot * mot)
    {
        if(!mot) return; //au cas où
        string motTente;
        // L'utilisateur rentre le mot qu'il souhaite
        mot->ajouterTentative(motTente);
        /** Le problème est là ! **/
        cout << mot->getTentatives().size() << endl;
    }
    En fonction de ce que tu préfères

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses. Lorsque je tente
    motActuel->ajouterTentative(motTente) pour garder les pointeurs, le compilateur me retourne cette erreur :

    error: base operand of '->' has non-pointer type 'Mot'|

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,
    Si tu n'as pas changé ton code, alors motActuel n'est pas un pointeur.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Salut, je pense que tu fais une malheureuse fixation sur les pointeurs !

    Dans ton cas, utiliser des références simplifierait ton code et éviterait des copies d'objets inutiles. Comme par exemple ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Mot::ajouterTentative(std::string tentative) // tu passes la chaine par valeur, 1ère copie
    {
        tentatives.push_back(tentative); // copie de ta chaine dans le vecteur, deuxième copie
    }
    Que tu pourrais remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Mot::ajouterTentative(const std::string & tentative) // passage par référence constante
    {
        tentatives.push_back(tentative); // une seule copie
    }
    Le deuxième cas t'as été donné par Kiroxas, remplace ton implémentation de jouerMot par la sienne.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

Discussions similaires

  1. Récupérer des lignes non enregistrées dans une table
    Par leddy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/04/2008, 15h09
  2. Réponses: 3
    Dernier message: 15/04/2008, 11h34
  3. Copier valeur non vide dans une colonne
    Par Toad08 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/03/2008, 21h40
  4. nombre de valeurs non nulles dans une tables
    Par 080983 dans le forum SQL
    Réponses: 33
    Dernier message: 27/08/2007, 12h04
  5. Valeur non trouvé dans une requète SQL
    Par Jeankiki dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/12/2006, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo