Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle while qui fait crash mon programme

Sujet résolu
    5 octobre 2018 à 21:09:08

    Bonjour à tous, je suis novice en c++ et je suis en train de faire un petit jeu type RPG.

    J'ai un  problème je voudrais une boucle while s'effectuant tant que les 2 personnages sont vivants, dans la boucle j'ai juste une condition if pour savoir si l'utilisateur a appuyé ou non sur un bouton (qui est Checkable). Mais lorsque j’exécute mon programme il crash au moment ou cette boucle commence, voici la boucle :

    do
    {
         if(ui->jouer->isChecked())
         {
            afficherJouer(joueur1, joueur2);
         }
    
    }while(joueur1.estVivant() && joueur2.estVivant());


    Je précise que c'est la même chose avec un while() normal. En fait je voudrais juste que le programme attende que l'utilisateur appui sur un bouton (il y a un deuxième bouton que j'ai pas mis ici) pour continuer et recommencer après toutes les actions entrainées par l'appui sur ce bouton.

    Merci d'avance pour vos réponses!

    • Partager sur Facebook
    • Partager sur Twitter
    Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
      5 octobre 2018 à 21:32:29

      Tu as la une boucle infini car rien ne modifie joueur 1 et joueur 2.
      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2018 à 0:03:20

        Bah si en fait si l'utilisateur appui sur un des boutons (le bouton attaque) le joueur2 va prendre des dégats. Je sais pas comment faire pour que le programme attende l'action de l'utilisateur...

        -
        Edité par Inferno02 6 octobre 2018 à 0:03:57

        • Partager sur Facebook
        • Partager sur Twitter
        Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
          6 octobre 2018 à 12:59:17

          Salut,

          Pourrais tu préciser ce que tu entend par "ca crash"???

          Et, de manière générale, pense bien au fait que la boucle do while ne vérifie la condition qu'après avoir exécuté ce qui se trouve entre le do et le while.

          Si bien que, si "manque de bol", tu te trouve dans une situation dans laquelle joueur1.estVivant() ou joueur2.estVivant() te renvoie false avant d'exécuter la première fois la boucle, elle sera exécutée au minimum une fois, alors que l'un des deux joueurs (voire les deux) est (sont) potentiellement "non vivant(s)" ;)

          Sinon, l'une des causes principales pour lesquelles un programme peut cracher lorsque l'on manipule des pointeurs, c'est que l'un d'eux se retrouve "dans la panade" (dandling pointer)

          Tu utilises, a priori au moins deux pointeurs dans cette boucle:

          • le premier sur ui
          • le deuxieme sur jouer

          Comme tu as été "assez aimable" que pour ne nous donner que le code qui provoque le crash, ni plus ni moins, je vais partir du pire cas possible : on n'a aucun moyen de garantir que ui->jouer->isChecked() n'essayera pas de déréférencer un pointeur invalide (que ce soit sur ui ou sur jouer).

          On peut -- éventuellement -- espérer que, si ui et / ou jouer est invalide, celui qui nous aura passé ces pointeurs aura pris le soin de leur donner une valeur connue pour représenter une adresse mémoire invalide (à savoir NULL / nullptr). (mais... peut on compter sur lui pour que ce soit le cas ????)

          Nous pouvons donc partir du principe que, si tel est le cas, cela doit être considéré comme une erreur de logique, et qu'il est préférable d'attirer l'attention de celui qui nous transmet ui et jouer sur le fait qu'il doit absolument corriger le problème.

          L'idéal, pour ce faire, c'est d'utiliser les assertions (nécessite l'inclusion de <cassert> pour la compilation, et de modifier la boucle pour lui donner une forme proche de

          // je ne corrige rien d'autre que le besoin d'assertion
          do
          {
              assert(ui!= nullptr && "invalid ui detected, please correct");
              assert(ui->jouer != nullptr && "invalid jouer detected, please correct");
               if(ui->jouer->isChecked())
               {
                  afficherJouer(joueur1, joueur2);
               }
           
          }while(joueur1.estVivant() && joueur2.estVivant());
          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            6 octobre 2018 à 15:16:16

            J'entend par crash, qu'il :

            1. Ne répond plus

            2. La petite fenêtre Windows apparait me demandait si je veux attendre ou fermer le programme

            Merci pour ta réponse @koala01 et je suis désolé de ne pas avoir fourni plus de code mais je ne savais pas quoi mettre. J'ai repensé mon code et je n'ai pas utilisé de While mais plutôt un Object::connect avec mon bouton comme ça le lien est toujours présent et pour l'instant ça me fait le taff, j'ai toutes les fonctionnalités qui marchent.

            Pour ta propositions je vais étudier les assert, je connaissais même pas leur existence :D. Ui est mon fichier ui de Qt Designer donc je vois pas comment il y aurai des problèmes avec le pointeur et jouer est un pointeur vers un bouton crée dans Qt Designer.

            Il y a peut-être des trucs débiles que je dis au-dessus mais je suis débutant, comprenez-moi ;)

            • Partager sur Facebook
            • Partager sur Twitter
            Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
              6 octobre 2018 à 16:05:34

              Au vu des symptomes que tu décris, je dirais que c'est "simplement" parce qu'il n'y a rien, dans la boucle, qui fasse passer l'état de joueur1 ou de joueur2 de "estVivant" à "n'est pas vivant".

              Il va donc se mettre à "boucler sans fin" ;)

              Inferno02 a écrit:

              Ui est mon fichier ui de Qt Designer donc je vois pas comment il y aurai des problèmes avec le pointeur et jouer est un pointeur vers un bouton crée dans Qt Designer.

              Oui, ben, tu vois, ca, c'est typiquement le genre de choses que seule ma boule de crystal aurait pu me faire savoir... Pas de bol, un de mes chats a joué avec hier, l'a faite tomber, et elle a volé en éclats :p

              Par contre, maintenant que l'on sait cela, on peut se brancher en "mode Qt" :D

              Inferno02 a écrit:

              Il y a peut-être des trucs débiles que je dis au-dessus mais je suis débutant, comprenez-moi ;)

              Oh, ce n'est pas une tare! Tout le monde a commencé un jour en tant que débutant ;)

              La seule chose à laquelle tu devras sans doute rapidement t'habituer, c'est que le meilleur moyen d'obtenir une aide efficace en programmation est encore d'aider les gens à t'aider:

              Plus tu leur donnes de précisions sur "ce qui ne marche pas" ou sur la bibliothèque que tu utilises, plus tu as de chances d'obtenir rapidement (oserais-je dire "directement"?) une aide efficace et cohérente avec ta situation actuelle ;)

              -
              Edité par koala01 6 octobre 2018 à 16:11:49

              • Partager sur Facebook
              • Partager sur Twitter
              Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

              Boucle while qui fait crash mon programme

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown