Recentemente ho trovato un bug sul mio codice che mi ha richiesto alcune ore per eseguire il debug.Perché alcune conversioni di tipo implicito sono sicure su una macchina e non su un'altra? Come posso prevenire questo problema multipiattaforma?
il problema è stato in una funzione definita come:
unsigned int foo(unsigned int i){
long int v[]={i-1,i,i+1} ;
.
.
.
return x ; // evaluated by the function but not essential how for this problem.
}
La definizione di v non ha causato alcun problema sulla mia macchina di sviluppo (Ubuntu 12.04 a 32 bit, compilatore g ++), dove il unsigned int erano implicitamente convertito in long int e in quanto tale i valori negativi sono stati gestiti correttamente.
Su una macchina diversa (Ubuntu 12.04 64 bit, compilatore g ++) tuttavia questa operazione non era sicura. Quando i = 0, v [0] non era impostato su -1, ma con qualche strano valore grande (come spesso accade quando si prova a fare un negativo int unsigned).
ho potuto risolvere il problema gettando il valore di i-lungo int
long int v[]={(long int) i - 1, (long int) i, (long int) i + 1};
e tutto ha funzionato bene (su entrambe le macchine).
Non riesco a capire perché il primo funziona bene su una macchina e non funziona sull'altro.
Potete aiutarmi a capire questo, in modo da poter evitare questo o altri problemi in futuro?
grazie per la spiegazione, anche se non ho potuto capire molto bene la tua risposta.Non ne sono del tutto sicuro, ma ricordo che int lungo è abbastanza grande da contenere int unsigned (almeno secondo alcuni riferimenti C++ che si possono trovare online). Ad ogni modo sono d'accordo che è una buona pratica non mescolarli, ma in questo caso è necessario che lo faccia. Ero solo curioso di sapere quando possono sorgere questi problemi dipendenti dalla macchina. – lucacerone