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++ - Una costante... birichina!
Forum - C/C++ - Una costante... birichina!

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:47
Sabato, 02/05/2015
Buonasera.
Mi capita una cosa strana che (anche se son riuscito ad aggirarla e quindi non mi crea problemi) non so come spiegarmi e quindi ma fa venir voglia di chiedere lumi. La questione è questa...

In un file main.h ho (tra le altre) queste costanti:

Codice sorgente - presumibilmente C/C++

  1. const SIZE kDimGrigliaTavola = { 8, 3 };
  2. const INT kMaxInTavola = kDimGrigliaTavola.cx * kDimGrigliaTavola.cy;



Le costanti vengono utilizzate qua e là nel programma, in diversi file. Ora, se compilo il programma con le impostazioni che Code::Blocks assegna di default per la modalità debug, le costanti "funzionano" come ci si aspetta, ovvero i membri di kDimGrigliaTavola valgono rispettivamente 8 e 3, e kMaxInTavola vale 24. La bizzarria è che se compilo lo stesso identico programma con le impostazioni che Code::Blocks assegna di default per la modalità "release" kDimGrigliaTavola continua a contenere 8 e 3, mentre kMaxInTavola contiene... ZERO! Questa cosa m'appare tanto insensata da farmi impazzire (si fa per dire)! Non c'è verso di convincere Code::Blocks a comportarsi in modo più ragionevole.

Per aggiungere bizzarria a bizzarria, se modifico il codice in main.h in questo modo, tutto funziona a puntino tanto in modalità debug quanto in modalità release:

Codice sorgente - presumibilmente C/C++

  1. const SIZE kDimGrigliaTavola = { 8, 3 };
  2. const INT kMaxInTavola = 24;



Che dite, devo chiamare un esorcista?



P.S. Le costanti fanno parte di un gioco di carte per Windows che sto TENTANDO DI mettere insieme. Se riuscirò a completarlo lo condividerò su pierotofy.it, sperando che qualcuno vorrà aiutarmi a cogliere le inevitabili pecche con le quali sarò riuscito a renderlo improponibile.


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:03
Domenica, 03/05/2015
Quale versione di ide e quale versione di compilatore?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 8:54
Domenica, 03/05/2015
Innanzi tutto, grazie per aver preso in considerazione la stranezza che ho proposto.

Il "fenomeno demoniaco" si verifica in Code::Blocks 13.12. Nelle informazioni sull'IDE (menu Help->About...), Code::Blocks aggiunge questi dati "build: Dec  27 2013, 15:58:38 - wx 2.8.12 (Windows, unicode) - 32 bit".

Stando a quello che mi dice la finestra di impostazioni che attivo dal menu "Settings->Compiler...", il compilatore che ho installato pare essere "GNU GCC Compiler" (che in effetti è quello snocciolato dal log di compilazione, nei quali si tira in ballo ad ogni passo anche mingw32).

Sai cosa pensavo? Probabilmente se leggo al contrario le stringhe del log ottengo dei messaggi satanici, come succede ascoltando i dischi heavy metal all'indietro... Qui c'è lo zampino di almeno una decina tra i bellimbusti citati su <http://it.wikipedia.org/wiki/Lista_di_demoni>;!

Ultima modifica effettuata da AldoBaldo il 03/05/2015 alle 8:57


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:50
Domenica, 03/05/2015
Come fai a sapere che quella variabile vale 0 ? Hai fatto cout/printf ?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:43
Domenica, 03/05/2015
Guarda ... ho provato e non succede ...

Probabilmente c'è un problema nel tuo codice che "sporca" la memoria e altera qualche valore. E il fatto che capiti solo in Release è la conferma del fatto che questo tipo di problemi hanno comportamento non definito ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 19:45
Domenica, 03/05/2015
la cosa più semplice, potrebbe essere che la "release" non corrisponda all'ultima versione in debug


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:40
Domenica, 03/05/2015
Una risposta alla volta...

@TheDarkJuster
Col debugger sono risalito al punto del programma a partire dal quale la situazione "impazziva", e in quel punto ho inserito un codice temporaneo che mi mostrasse una MessageBox col valore incriminato (che è risultato essere 24 se il programma veniva eseguito nella versione per il debugger e zero se veniva eseguito nella versione per la release).

@Nessuno
Ipotesi interessante e plausibile, ammesso che io abbia capito bene. Intendi dire che magari scrivendo da qualche parte per indirizzo ho usato un indirizzo campato in aria o che ho scritto oltre i limiti di un array? Di solito ci sto attento, ma non è escluso (e, tristemente, temo che farei una fatica orba a individuare dove potrebbe stare un errore del genere). Se l'ipotesi che indichi fosse davvero questa, la differenza tra Debug e Release potrebbe essere dovuta al fatto che i due eseguibili hanno una struttura interna diversa per cui lo stesso errore potrebbe provocare sovrapposizioni e riscritture errate diverse? (il file della versione per il debug è parecchio più grande).
Per inciso, kDimGrigliaTavola conserva i suoi valori corretti (almeno nel punto del programma e dell'esecuzione in cui kMaxInTavola risulta fallato).

@Ultimo
Non credo che possa essere così, perché prima di verificare ho ricompilato per intero entrambe le versioni (che condividono lo stesso identico sorgente).

Probabilmente ha ragione Nessuno, ma non escluderei l'ipotesi demoniaca... :asd: Cercherò di fare qualche ulteriore verifica (grazie per lo spunto, non ci avrei mai pensato).

Ultima modifica effettuata da AldoBaldo il 03/05/2015 alle 20:42


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:06
Domenica, 03/05/2015
Porca l'oca! La funzione nella quale ho scoperto che kMaxInTavola assume valore zero è  NuovaPartita(). Per restringere il campo della verifica ho provato a mettere il mio MessageBox "spia" subito prima della chiamata alla funzione e subito dopo il ritorno dalla funzione. Risultato? Sia prima, sia dopo la chiamata a NuovaPartita(), kMaxInTavola è e rimane... 24! (come dovrebbe essere). Però, nel corso dell'esecuzione della funzione, il valore di kMaxInTavola è 0, senza possibilità di dubbio.

kMaxInTavola è una COSTANTE, per cui non è possibile che io le abbia in qualche modo attribuito esplicitamente il valore 0 e poi abbia ripristinato il valore 24. Inoltre, quante sono le possibilità che l'attribuzione dello 0 e il ripristino del valore originale siano avvenute a seguito di una scrittura non intenzionale tramite un indirizzo "impazzito"? Direi che sono quasi nulle, no?

Inoltre, ripensandoci, com'è che se inizializzo la costante direttamente con "24" anziché con kDimGrigliaTavola.cx * kDimGrigliaTavola.cy il fenomeno di azzeramento non si verifica? Anche questo è insensato, TOTALMENTE insensato!

Demoni, non possono essere che demoni...
Ci vuole un esorcista informatico, ci vuole!

Ultima modifica effettuata da AldoBaldo il 03/05/2015 alle 21:10


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 22:36
Domenica, 03/05/2015
non per niente il C e C++ sono unmanaged, la gestione della memoria ram è gestita dal developer,
probabile che il tutto si riconduca alla gestione della memoria


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo