最近、コードにバグが見つかり、デバッグに数時間かかりました。
問題は、次のように定義された関数にありました。
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.
}
vの定義は、私の開発マシン(ubuntu 12.04 32ビット、g ++コンパイラ)では問題を引き起こしませんでした。この場合、unsignedintは暗黙的にlongintに変換され、負の値は正しく処理されました。
別のマシン(ubuntu 12.04 64ビット、g ++コンパイラ)では、この操作は安全ではありませんでした。i = 0の場合、v [0]は-1に設定されていませんが、奇妙な大きな値に設定されています(unsigned intを負にしようとしたときによく発生します)。
iの値をlongintにキャストする問題を解決できました
long int v[]={(long int) i - 1, (long int) i, (long int) i + 1};
そして、すべてが正常に機能しました(両方のマシンで)。
最初のマシンで正常に動作し、他のマシンでは動作しない理由がわかりません。
これを理解するのを手伝って、将来この問題や他の問題を回避できるようにしてください。