4

他の人が興味を持つかもしれない一般的な質問:

私は、switch ステートメントで C++ コンパイラの最適化 (Visual Studio 2005) の問題に遭遇したと思います。私が知りたいのは、私の好奇心を満たし、コンパイラが何をしようとしているが失敗しているのかを知る方法があるかどうかです。解読に時間を費やすことができるログはありますか (おそらく時間がかかりすぎます)。

続きを読みたいという好奇心旺盛な人のための私の特定の問題- この特定のケースで問題が発生する理由について、あなたの考えを聞きたいです。

switch ステートメントを含む約 500 行のコードを含む小さなプログラムがあります。一部のケースには、ポインターの割り当てが含まれています。

double *ptx, *pty, *ptz;
double **ppt = new double*[3];

//some code initializing etc ptx, pty and ptz 

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

中間のステートメントでコンパイラがハングしているようです。コンパイルは終わりません。OK、廊下を歩き、何人かと話し、コーヒーを飲んで机に戻るまでにそれほど時間はかかりませんでしたが、これは通常 1 秒以内にコンパイルされる小さなプログラムです。1 行 (上記のコードに示されている行) を削除すると、最適化 (プログラム全体または関数で #pragma を使用) を削除する場合と同様に、問題は解消されます。

この中間線が問題を引き起こすのはなぜですか? コンパイラのオプティマイザは pty を好みません。プログラム内のベクトル ptx、pty、および ptz に違いはありません。私が pty に対して行うことはすべて、ptx と ptz に対して行います。ppt で位置を交換しようとしましたが、pty は依然として問題を引き起こしている行でした。

どうなっているのか気になったので質問させていただきます。コードは書き直され、正常に動作しています。

編集: ほぼ 2 週間後、上記のコードに最も近いバージョンをチェックアウトしましたが、元に戻してクラッシュさせることはできません。これは本当に迷惑で、恥ずかしくてイライラします。もう一度試してみますが、すぐに壊れない場合は、質問のこの部分が時代遅れになっていると思いますので、削除します。お時間を頂戴し誠に申し訳ございませんでした。

4

4 に答える 4

1

このコードをあまり変更せずにコンパイル可能にする必要がmemcpyある場合は、値を に割り当てる場所を使用することを検討してくださいppt[1]。これで少なくとも問題なくコンパイルできるはずです。ただし、問題は、ソースコードの別の部分がこの動作を引き起こしているようです。

あなたが試すことができるのは、このようなものを置くことです:

ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;

別の関数で。これは、コンパイラがコードをコンパイルするために取っているパスを回避するのにも少し役立ちます。

于 2009-09-10T11:49:40.360 に答える
0

ptyの名前を別の名前(つまりpt_y)に変更してみましたか?一部の名前が「予約済み」のように見えるという問題が数回発生しました(つまり、変数「rect2」を使用)。

于 2009-09-10T09:54:58.277 に答える
0

コンパイラのバグのようです。行を並べ替えてみましたか?例えば、

ppt[1]=pty; 
ppt[0]=ptx;
ppt[2]=ptz;

また、割り当てられた値を調整するとどうなりますか(コードにバグが発生しますが、問題のポインターまたは配列のどちらであるかを示す場合があります)。例:

ppt[0] = pty;
ppt[1] = ptz;
ppt[2] = ptx;

(または類似)。

于 2009-09-10T10:34:16.560 に答える
0

おそらく、同じアドレスを使用するように最適化されているptx、pty、およびptzの宣言が原因です。次に、このアクションにより、コードの後半でコンパイラの問題が発生します。

試す

static double *ptx;
static double *pty;
static double *ptz;
于 2009-09-15T10:56:27.247 に答える