Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Accedere a una funzione di un puntatore ad oggetto iterato (list<En*>)
Forum - C/C++ - Accedere a una funzione di un puntatore ad oggetto iterato (list)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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

  1. for(list<En*>::iterator it = enemys.begin(); it != enemys.end(); it++) {
  2.   (*it)->moveFrame();
  3. }



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++

  1. void En::moveFrame() {
  2.   if(!pause) {
  3.     pos.angle += aSpeed;
  4.     pos.dist -= lSpeed;
  5.   }
  6. }



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++

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



Codice sorgente - presumibilmente C/C++

  1. 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) {
  2.   parent->addEn(this);
  3. }



Codice sorgente - presumibilmente C/C++

  1. void Sq::addEn(En *enemy) {
  2.   enemys.push_back(enemy);
  3. }
  4.  
  5. // Dove enemys:
  6. list<En*> enemys;



Ringrazio in anticipo chi avrà la pazienza di aiutarmi, grazie :)

Ultima modifica effettuata da il 19/07/2012 alle 10:14
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:47
Giovedì, 19/07/2012
Cosa è e quanto vale

pause

?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:54
Giovedì, 19/07/2012
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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:00
Giovedì, 19/07/2012
Quindi, dato che tu hai presente tutto il codice, la domanda è .... questa if

Codice sorgente - presumibilmente Plain Text

  1. if(!pause) {
  2.     pos.angle += aSpeed;
  3.     pos.dist -= lSpeed;
  4.   }



viene *sempre* eseguita o *mai* eseguita ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:18
Giovedì, 19/07/2012
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

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:02
Giovedì, 19/07/2012

è 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.


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:16
Giovedì, 19/07/2012
Testo quotato

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 ...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 13:28
Giovedì, 19/07/2012
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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:34
Giovedì, 19/07/2012
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 ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo