Donc je fais un jeu de serpents avec les téléports et les souris habituelles. J'ai eu une boucle en cours d'exécution comme ceci:Mystérieux heisenbug?
while(snake.alive() && miceEaten < micePerLevel)
{
displayInfo(lives, score, level, micePerLevel - miceEaten);
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
}
Le problème avec le code ci-dessus est que displayInfo
est appelé avant le score est mis à jour, et ainsi après avoir mangé une souris, l'utilisateur doit attendre jusqu'à ce que la boucle fonctionne à nouveau voir son score mis à jour. J'ai donc déplacé cette ligne de code vers le bas de la fonction:
while(snake.alive() && miceEaten < micePerLevel)
{
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
displayInfo(lives, score, level, micePerLevel - miceEaten);
}
et les téléportations s'arrêtent de fonctionner! Le programme se bloque chaque fois que le serpent atteint un téléport. Et displayInfo
utilise le code suivant:
stringstream s;
s << "LEVEL " << left << setw(12) << level << "LIVES: " << setw(12) << lives << "MICE LEFT: " << setw(12) << miceLeft
<< "SCORE: " << setw(13) << score;
printLine(0, s.str(), WHITEONBLUE);
Où printLine
a seulement color_set
, mvprintw
et refresh()
. Rien à voir avec Teleports. Bizarre.
donc je suis allé à la fonction de serpent où le serpent tire son prochain emplacement d'une téléportation:
body.push_back(teleports[overlap(next)]->teleportFrom(dir)); //next is a Location object
Où teleports[overlap(next)]->teleportFrom(dir)
retourne l'emplacement du serpent doit être téléporté. Pour tenter de comprendre pourquoi il plantait (peut-être Teleport
rentrait un emplacement hors-champ?), J'ai ajouté les 3 lignes suivantes avant la ligne ci-dessus:
Location l = teleports[overlap(next)]->teleportFrom(dir);
mvprintw(1, 0, "(%i, %i)", l.x, l.y);
refresh();
Et le problème disparait!
Non seulement cela, mais je dois avoir ces trois lignes. Si je commente mvprintw(1, 0, "(%i, %i)", l.x, l.y);
, ou refresh();
, ou les deux, le programme se bloque comme avant en atteignant une téléportation.
Des idées sur ce qui pourrait causer ce comportement?
MISE À JOUR: J'ai essayé de supprimer tous les avertissements (qui étaient pour la plupart des avertissements au sujet des comparaisons de signature/numéros non signés), mais seulement 1 reste à ce jour:
warning: reference to local variable 'other' returned
Et le code:
Location& Location::operator = (Location other)
{
if(this == &other)
return other;
x = other.x;
y = other.y;
return *this;
}
Que faire pour corriger cet avertissement?
Vous obtenez un comportement indéfini quelque part. (Vous êtes probablement en train d'accéder à un objet hors limites et de vider la pile, les données environnantes ou quoi que ce soit d'autre.) Vous devez parcourir votre code et vérifier tous vos accès. – GManNickG
Vous avez un comportement indéfini ailleurs dans votre code. Compilez votre code avec tous les avertissements activés. Et assurez-vous qu'aucun avertissement n'est signalé (les avertissements sont généralement des erreurs). La façon dont vous activez les avertissements dépend du compilateur. Si cela ne fonctionne pas, vous devez utiliser un outil qui vous informera de la corruption de la mémoire (encore dépendante de la plate-forme). –
@Martin York - J'ai essayé de supprimer tous les avertissements, s'il vous plaît voir ma mise à jour. Je pense que cet avertissement peut être la cause, mais j'ai besoin d'aide. Merci! – wrongusername