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

SL & STL C++ Discussion :

Bug avec un vector<string> qui disparaît si on code sans conteneur


Sujet :

SL & STL C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Bug avec un vector<string> qui disparaît si on code sans conteneur
    [Edit]Faut croire que des dizaines de tests étaient pas suffisants, le bug est réapparu même sans ça. J'ai aucune idée de ce qui le cause donc pour l'instant, autant enterrer ce thread.


    Bonjour à tous,

    J'ai un petit souci de code avec l'utilisation de vector (j'ai déjà lu la FAQ, mon problème n'a pas l'air d'y apparaître).
    Je programme un jeu de plateau avec une IA. J'ai une fonction qui détermine la liste des coups légaux et les stocke dans un vector<string> . Ensuite les fonctions d'IA bouclent sur ce vector pour tester les différents coups.
    La fonction permettant de déterminer si un coup est légal ou non marche, et la liste est valide (j'ai fait de nombreux tests pour m'assurer de ça), donc ça vient de mon utilisation du vecteur.
    Puisque, et c'est là que je suis perdu, si je reprends le code de création du vecteur et que je le colle à l'intérieur des fonctions d'IA... le bug disparait.

    Voici la fonction qui me permet de remplir le vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void coupsLegaux(vector<string> &liste, Plateau plateau)
    {
        string coup = "Y0e "; //Initialise la chaîne à la bonne taille
     
        for (int i = 0; i < T; i++)
        {
            for (int j = 0; j < T; j++)
            {
                for (int k = 0; k < 4; k++)
                {
                    coup = creerCoup(i, j, k);
                    if (coupLegal(coup, plateau))
                    {
                        liste.push_back(coup);
                    }
                }
            }
        }
    }
    Vraiment pas compliquée. Il y a trois boucles parce qu'en plus de vérifier chaque case du plateau, il faut vérifier quatre "directions" dans laquelle jouer. C'est une particularité du jeu sur lequel je travaille et je doute que ça ait la moindre importance dans l'exécution.

    Voici ensuite le code de la fonction d'IA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vector<string> liste;
    coupsLegaux(liste, plateau);
     
     
    for (unsigned int i = 0; i < liste.size(); i++)
     {
              jouerCoup(liste[i], plateau, depth, joueur);
              temp = -(negamax(plateau, depth+1));
              defaireCoup(liste[i], plateau, depth);
     
              /*Reste de l'algorithme IA, qui n'intéragit plus avec le plateau*/
    }
    Donc ce code plante, enfin pas tout le temps. J'ai du mal à cerner le bug exact, mais en gros y'a un ou plusieurs pions qui disparaissent au bout d'un certain nombre d'itérations.
    Et donc, si au lieu de boucler sur la liste de coups légaux (qui, je le répète, sont bien tous corrects au moment de la création de la liste) je mets ma triple boucle à l'intérieur de la fonction d'IA et qu'au lieu de faire une liste je fais juste "coup = creerCoup(i, j, k)" et travaille sur la variable coup, ça marche.
    Donc techniquement ça va, le bug n'est pas trop gênant... sauf qu'il alourdit quand même le code et le rend assez moche à lire.

    Voilà, merci d'avance pour votre aide et j'espère avoir inclus assez d'informations.

    P.S. Je suis pas un très bon programmeur C++ donc vous excuserez les éventuelles fautes de standardisation ou autres. ^^

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Essaie déjà d'activer le mode debug de la bibliothèque standard et/ou de faire tourner le code avec valgrind/efence voir si t'as pas invoqué un comportement indéfini quelque part.

    Sinon l'idéal pour résoudre un problème c'est de créer un cas minimal isolé. Là avec les bouts que tu donnes ça ne semble pas suffisant, et on ne veut pas tout ton code non plus.
    Boost ftw

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vector<string> liste;
    coupsLegaux(liste, plateau);
     
     
    for (unsigned int i = 0; i < liste.size(); i++)
     {
              jouerCoup(liste[i], plateau, depth, joueur);
              temp = -(negamax(plateau, depth+1));
              defaireCoup(liste[i], plateau, depth);
     
              /*Reste de l'algorithme IA, qui n'intéragit plus avec le plateau*/
    }
    est-ce que defaireCoup va aussi retirer du vector l'entrée correspondante ?
    auquel cas, tu vas droit hors bornes de ton vector
    préfère les itérateurs pour parcourir un vector
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 13
    Points : 33
    Points
    33
    Par défaut
    Meme si c'était possible (défaireCoup n'a pas le vector en paramètre), comme il recalcule la taille du vector a chaque itération il est peu probable qu'il en sorte.

    Par contre ça aurais comme conséquence de faire oublier certains coups a l'algo, ceux se trouvant juste âpres les coup "défait".

    A voir si ça correspond a ses symptômes.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Ce genre de bug apparait souvent lorsqu'on renvoi une référence sur un objet local.

    Ceci dit, comme l'indique loufoque, les informations données ne sont pas suffisantes pour faire autre chose que de la spéculation. Faudrait un peu plus de code.

Discussions similaires

  1. Bug avec JSON avec un tableau contenant un index en string
    Par LaurentC33 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/06/2014, 14h37
  2. [AJAX] Autocomplétion qui bug avec un espace
    Par jmusial dans le forum AJAX
    Réponses: 1
    Dernier message: 17/06/2012, 08h41
  3. Bug avec les strings
    Par sphere369 dans le forum Débuter
    Réponses: 5
    Dernier message: 19/02/2009, 19h59
  4. bug avec String.IndexOf()
    Par giova_fr dans le forum C#
    Réponses: 17
    Dernier message: 19/12/2007, 14h48
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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