Oppure

Loading
19/07/12 8:13
Io uso una lista (enemys) di puntatori ad oggetti En e devo eseguire la funzione moveFrame() per ogniuno, quindi scrivo:

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()

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.

mainSq = new Sq(sq, CartPoint(width / 2, height / 2));
new En(mainSq, en, PolarPoint(400, 0));


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);
}


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 19/07/12 8:14
19/07/12 8:47
nessuno
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à.
19/07/12 8:54
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
19/07/12 9:00
nessuno
Quindi, dato che tu hai presente tutto il codice, la domanda è .... questa if

  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à.
19/07/12 9:18
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
19/07/12 11:02
HeDo

è 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.
aaa
19/07/12 11:16
nessuno
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à.
19/07/12 11:28
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 19/07/12 11:36