Quindi sto facendo un gioco di serpenti con i teletrasporti e i soliti topi. Ho avuto un ciclo in esecuzione come questo:Misterioso heisenbug?
while(snake.alive() && miceEaten < micePerLevel)
{
displayInfo(lives, score, level, micePerLevel - miceEaten);
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
}
Il problema con il codice di cui sopra è che displayInfo
viene chiamato prima che il punteggio viene aggiornato, e così dopo aver mangiato un topo, l'utente deve attendere che il ciclo viene eseguito di nuovo per guarda il suo punteggio aggiornato. Così ho spostato quella riga di codice nella parte inferiore della funzione:
while(snake.alive() && miceEaten < micePerLevel)
{
//some code
if(miceEaten())
{
//update score...
}
//more stuff...
displayInfo(lives, score, level, micePerLevel - miceEaten);
}
e teleport smettono di funzionare! Il programma si blocca quando il serpente raggiunge un teletrasporto. E displayInfo
utilizza il seguente codice:
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);
Dove printLine
ha solo una color_set
, mvprintw
e refresh()
. Niente a che vedere con Teleports. Strano.
Così sono andato alla funzione serpente in cui il serpente prende il prossimo luogo da un teletrasporto:
body.push_back(teleports[overlap(next)]->teleportFrom(dir)); //next is a Location object
Dove teleports[overlap(next)]->teleportFrom(dir)
restituisce la posizione del serpente deve essere teletrasportato a. Nel tentativo di capire perché si è in crash (forse Teleport
stava tornando una certa posizione fuori campo?), Ho aggiunto le seguenti 3 righe prima della riga sopra:
Location l = teleports[overlap(next)]->teleportFrom(dir);
mvprintw(1, 0, "(%i, %i)", l.x, l.y);
refresh();
E il problema scompare!
Non solo, ma DEVO avere queste tre linee. Se commento fuori mvprintw(1, 0, "(%i, %i)", l.x, l.y);
, o refresh();
, o entrambi, il programma si blocca come prima al raggiungimento di un teletrasporto.
Qualche idea su cosa potrebbe causare questo comportamento?
UPDATE: Ho provato a rimuovere tutti gli avvisi (che erano per lo più gli avvertimenti circa i confronti di firma/numeri senza segno), ma solo 1 rimane finora:
warning: reference to local variable 'other' returned
E il codice:
Location& Location::operator = (Location other)
{
if(this == &other)
return other;
x = other.x;
y = other.y;
return *this;
}
Cosa devo fare per correggere questo avviso?
Si sta ottenendo un comportamento indefinito da qualche parte. (Probabilmente, stai accedendo a qualcosa di fuori limite e rovinando la pila, i dati circostanti o qualsiasi altra cosa.) È necessario scorrere il codice e controllare tutti i tuoi accessi. – GManNickG
Hai qualche comportamento non definito da qualche altra parte nel tuo codice. Compila il tuo codice con tutti gli avvisi attivati. E assicurarsi che non ci siano avvisi segnalati (gli avvertimenti sono di solito errori). Come si attivano gli avvisi dipenderà dal compilatore. Se ciò non funziona, è necessario utilizzare uno strumento che ti informi sulla corruzione della memoria (sempre dipendente dalla piattaforma). –
@Martin York - Ho provato a rimuovere tutti gli avvisi, per favore vedi il mio aggiornamento. Penso che questo avvertimento possa essere la causa, ma ho bisogno di aiuto. Grazie! – wrongusername