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!
Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
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
Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
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());
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
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
Qui ne tente rien n'a rien | "Coding is not difficult" - Bill Gates
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
Par contre, maintenant que l'on sait cela, on peut se brancher en "mode Qt"
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
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.