質問

いバグがこの条件:

while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
{
     CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
     CurrentObserverPathPointDisplacement -= lengthToNextPoint;
     lengthToNextPoint = (CurrentObserverPath->pathPoints[min((PathSize - 1),CurrentObserverPathPointIndex + 1)] - CurrentObserverPath->pathPoints[CurrentObserverPathPointIndex]).length();
}

そのために無限ループがリリースモードになります。動作デバッグモードでは、以interstinglyを入れる場合にはデバッグすので、最終ライン

OutputInDebug("Here");

ここでは、生成された組み立てのための条件付では

            while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00F074CF  fcom        qword ptr [dist]  
00F074D2  fnstsw      ax  
00F074D4  test        ah,5  
00F074D7  jp          ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)  
00F074D9  mov         eax,dword ptr [dontRotate]  
00F074DC  cmp         eax,ebx  
00F074DE  jge         ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)  
            {

できることの条件で作動条件は何かという問題であるの値にdontRotate"は、関数のパラメータの型がboolで、eaxを比較する技術を開発しているので、dontRotateはもう少しのコードです。

モバゲーさんやグリーさんとか少しデータないかなと思いは明らかにコンパイラエラーはできます。ところが、なんなのかどう輌でくれる十分な問題を実際に演出しバグを報告する。

編集:ない実際のdecelerationsの種類:

double CurrentObserverPathPointDisplacement;
double lengthToNextPoint;
int CurrentObserverPathPointIndex;
int PathSize;
vector<vector3<double>> CurrentObserverPath::pathPoints;

Edit2:

回を追加するにはデバッグを印刷算書の最後に、この組立を発生するため、なくなりに表現してバグの修正:

            while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00B1751E  fcom        qword ptr [esi+208h]  
00B17524  fnstsw      ax  
00B17526  test        ah,5  
00B17529  jp          ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)  
00B1752B  mov         eax,dword ptr [esi+200h]  
00B17531  cmp         eax,ebx  
00B17533  jge         ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)  
            {
役に立ちましたか?

解決

ここ:

while(/* foo */ && CurrentObserverPathPointIndex < (PathSize - 1) )
{
     CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;

これが唯一のポイントであるため(場合を除きます min 本当に厄介なことをします)ループで CurrentObserverPathPointIndex 変更され、両方が変更されます CurrentObserverPathPointIndexPathSize 同じサイズの署名整数(および PathSize 整数プロモーションの問題を除外するのに十分なほど小さい)、残りの浮動点のいわだは無関係です。ループは最終的に終了する必要があります(の初期値が CurrentOvserverPathPointIndex に比べて小さい PathSize, 、 けれど)。

これにより、結論は1つだけです。コンパイラが終了しないコードを(これまで)生成する場合、コンパイラは間違っています。

他のヒント

のようにな PathSize 変わりませんのループのコンパイラが計算できます。 PathSize - 1 前のループを、偶然にも同一のメモリ位置してい dontRotate, いることです。

より重要なのは、どのように多くの要素がありま CurrentObserverPath->pathPoints?

ごループ条件を含むこの試験:

CurrentObserverPathPointIndex < (PathSize - 1)

内ループはこの課題:

CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;

その後この更なる増加が下付き文字:

[min((PathSize - 1),CurrentObserverPathPointIndex + 1)]

つくコードを作品に登場したデバッグモードがランダムに未定義の動作に登場す。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top