1

PellesC C コンパイラを使用しています。時々、コードがランダムに動作しなくなります。特定のステートメントがそれを引き起こす可能性があります。たとえば、変数に sin(c) (c は double) を掛けたところ、コードは実行を終了したように見え、結果はありませんでした。フリーズすることもあれば、戻ってくるように見えることもありますが、問題のあるステートメントを削除するか、コンパイラの最適化、具体的には「速度を最大化」または「速度をさらに最大化」を無効にすることで、いつでも修正できます。クラッシュするポイントの近くに printf ステートメントを追加すると、ほぼ 100% の確率でフリーズが解消されます。メモリに不適切にアクセスしていることを示唆するものは何も見つかりませんでした。コンパイラの問題であると確信しています。誰かがこれに光を当てることができるかどうか疑問に思っていました。私は、実際には、何か間違ったことをしていますか?それとも、これは Pelles C コンパイラの既知の問題ですか?

編集:

変化

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+sin(c)));

to (最終行末の差分)

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+1));

それを機能させます。

4

2 に答える 2

4

どちらでもかまいませんが、それはあなた自身です:)明示的に初期化されていない変数は、最適化されたビルドと最適化されていないビルドで異なる値を取得することがよくあります。これは、コンパイラが一時的なものをどれだけ積極的に削除するかによって、スタックレイアウトが微妙に変わる可能性があるためです。だけでなく、他の要因。

于 2012-07-11T22:58:46.110 に答える
2

おそらくどこかで誤って未定義の動作を使用しており、プログラム内のランダムな命令を変更すると、たまたまプログラムが機能するスタック上のコードの非常に壊れやすいアライメントが壊れています。

于 2012-07-12T04:12:58.943 に答える