Así que estoy haciendo un juego de serpientes con telepuertos y los ratones habituales. Tenía un bucle se ejecuta la siguiente manera:Mysterious heisenbug?
while(snake.alive() && miceEaten < micePerLevel)
{
displayInfo(lives, score, level, micePerLevel - miceEaten);
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
}
El problema con el código anterior era que displayInfo
es llamado antes de la puntuación se actualiza, por lo que después de comer un ratón, el usuario tiene que esperar hasta que el bucle se ejecuta de nuevo a ver su puntaje actualizado Así que moví esa línea de código a la parte inferior de la función:
while(snake.alive() && miceEaten < micePerLevel)
{
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
displayInfo(lives, score, level, micePerLevel - miceEaten);
}
y los telepuertos dejan de funcionar! El programa se bloquea cada vez que la serpiente alcanza un telepuerto. Y displayInfo
utiliza el siguiente código:
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);
Dónde printLine
sólo tiene un color_set
, mvprintw
y refresh()
. Nada que ver con Teleports. Extraño.
así que fui a la función de serpiente, donde la serpiente obtiene su próxima ubicación de un telepuerto:
body.push_back(teleports[overlap(next)]->teleportFrom(dir)); //next is a Location object
Dónde teleports[overlap(next)]->teleportFrom(dir)
devuelve la ubicación de la serpiente es para ser teletransportado a. En un intento para ver por qué estaba fallando (quizás Teleport
regresaba algún lugar fuera de la pantalla?), He añadido los siguientes 3 líneas antes de la línea anterior:
Location l = teleports[overlap(next)]->teleportFrom(dir);
mvprintw(1, 0, "(%i, %i)", l.x, l.y);
refresh();
Y el problema desaparece!
No solo eso, sino que TENGO que tener esas tres líneas. Si hago un comentario mvprintw(1, 0, "(%i, %i)", l.x, l.y);
, o refresh();
, o ambos, el programa se bloquea como antes al llegar a un telepuerto.
¿Alguna idea sobre qué podría estar causando este comportamiento?
ACTUALIZACIÓN: que intentó eliminar todas las advertencias (que en su mayoría eran advertencias sobre las comparaciones de firmado/números sin signo), pero sólo 1 permanece hasta el momento:
warning: reference to local variable 'other' returned
Y el código:
Location& Location::operator = (Location other)
{
if(this == &other)
return other;
x = other.x;
y = other.y;
return *this;
}
¿Qué debo hacer para corregir esta advertencia?
Estás obteniendo un comportamiento indefinido en alguna parte. (Probablemente, está accediendo a algo que está fuera de los límites y arruinando la pila, los datos que lo rodean o cualquier otra cosa). Tiene que pasar por su código y verificar todos sus accesos. – GManNickG
Tiene un comportamiento indefinido en otro lugar de su código. Compila tu código con todas las advertencias activadas. Y asegúrese de que no haya advertencias informadas (las advertencias suelen ser errores). Cómo activar las advertencias dependerá del compilador. Si eso no funciona, debe usar una herramienta que le informará sobre la corrupción de la memoria (también depende de la plataforma). –
@Martin York - Intenté eliminar todas las advertencias, consulte mi actualización. Creo que esta advertencia puede ser la causa, pero necesito ayuda. ¡Gracias! – wrongusername