
()
Newbie
    
Messaggi:
Iscritto:
|
Io uso una lista (enemys) di puntatori ad oggetti En e devo eseguire la funzione moveFrame() per ogniuno, quindi scrivo:
Codice sorgente - presumibilmente Plain Text |
for(list<En*>::iterator it = enemys.begin(); it != enemys.end(); it++) {
(*it)->moveFrame();
}
|
Facendo il debug del codice il programma entra nel for ma facendo "Step Into" sull'istruzione moveFrame() non entra nella funzione, non riesco a eseguirla...
Quindi ho provato a spostare il break point nel comando En::moveFrame()
Codice sorgente - presumibilmente C/C++ |
void En::moveFrame() {
if(!pause) {
pos.angle += aSpeed;
pos.dist -= lSpeed;
}
}
|
e mi dice sul break point che non potrà essere mai raggiunto perchè non è stato compilato a causa di un ottimizzazione da parte del linker  non ho capito perchè il linker rimuova un pezzo di codice usato e non so come risolvere questo problema.
Aggiungo anche (non penso sia un problema, ma non si sa mai) che uso l'oggetto En nel file Sq.cpp e non accedo ai suoi membri direttamente, nè lo inserisco io nella lista, è il suo costruttore a farlo.
Codice sorgente - presumibilmente C/C++ |
mainSq = new Sq(sq, CartPoint(width / 2, height / 2));
new En(mainSq, en, PolarPoint(400, 0));
|
Codice sorgente - presumibilmente C/C++ |
En::En(Sq *parent, ALLEGRO_BITMAP *image, PolarPoint position, float linearSpeed, float angularSpeed, bool sPause): owner(parent), img(image), pos(position), lSpeed(linearSpeed), aSpeed(angularSpeed), pause(sPause) {
parent->addEn(this);
}
|
Codice sorgente - presumibilmente C/C++ |
void Sq::addEn(En *enemy) {
enemys.push_back(enemy);
}
// Dove enemys:
list<En*> enemys;
|
Ringrazio in anticipo chi avrà la pazienza di aiutarmi, grazie Ultima modifica effettuata da il 19/07/2012 alle 10:14 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6329
Iscritto: 03/01/2010
|
Cosa è e quanto vale
pause
?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Per non creare confusione non ho postato tutto il codice, ma pause e pauseEn sono sempre false e i parametri che non ho inserito nella creazione di En e Sq sono definiti come valori di default nei rispettivi file .h
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6329
Iscritto: 03/01/2010
|
Quindi, dato che tu hai presente tutto il codice, la domanda è .... questa if
Codice sorgente - presumibilmente Plain Text |
if(!pause) {
pos.angle += aSpeed;
pos.dist -= lSpeed;
}
|
viene *sempre* eseguita o *mai* eseguita ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Quell'IF NON può essere eseguita in quanto NON è nemmeno nel file binario perchè il linker decide che è solo "dead code", quindi NON viene MAI eseguita e non posso nemmeno posizionare un break point su quella linea
|
|

HeDo (Founder Member)
Guru^2
    
Messaggi: 2765
Iscritto: 21/09/2007
|
è ovvio che se pause è false quel codice non viene mai eseguito, e di conseguenza il compilatore è abbastanza furbo da dirtelo pure... ma tu sei testardo e ci metti pure un breakpoint, vediamo chi vince.
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6329
Iscritto: 03/01/2010
|
Postato originariamente da Dario DF:
Quell'IF NON può essere eseguita in quanto NON è nemmeno nel file binario perchè il linker decide che è solo "dead code", |
Tanto per cominciare non è il linker a deciderlo ma il compilatore.
E secondo, la questione è al contrario.
Non è che non viene eseguita perché non è nel file binario *ma* non è compilata perché non è eseguibile!
Ecco che il metodo è in realtà vuoto e quindi non è possibile inserire il tuo break.
Solo se includerai codice eseguibile all'interno del metodo o disattiverai le ottimizzazioni del compilatore, allora potrai eseguire quel codice.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Però effettuo due assegnazioni:
pos.angle += aSpeed;
pos.dist -= lSpeed;
EDIT: ho pensato: perchè il compilatore non dovrebbe fare quelle assegnazioni?
Ho ricontrollato il codice e mi sono accorto di aver dimenticato di chiudere un commento multilinea in un altro file: quello che utilizzava "pos" quindi non era usato ed è stato omesso, sono riuscito a risolvere, Grazie
Ultima modifica effettuata da il 19/07/2012 alle 13:36 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6329
Iscritto: 03/01/2010
|
Ma se la if non viene mai soddisfatta quelle assegnazioni è come se non ci fossero ... no?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|