このコンパイラエラーにVisual Studio2010?
-
28-10-2019 - |
質問
いバグがこの条件:
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
変更され、両方が変更されます CurrentObserverPathPointIndex
と PathSize
同じサイズの署名整数(および PathSize
整数プロモーションの問題を除外するのに十分なほど小さい)、残りの浮動点のいわだは無関係です。ループは最終的に終了する必要があります(の初期値が CurrentOvserverPathPointIndex
に比べて小さい PathSize
, 、 けれど)。
これにより、結論は1つだけです。コンパイラが終了しないコードを(これまで)生成する場合、コンパイラは間違っています。
他のヒント
のようにな PathSize
変わりませんのループのコンパイラが計算できます。 PathSize - 1
前のループを、偶然にも同一のメモリ位置してい dontRotate
, いることです。
より重要なのは、どのように多くの要素がありま CurrentObserverPath->pathPoints
?
ごループ条件を含むこの試験:
CurrentObserverPathPointIndex < (PathSize - 1)
内ループはこの課題:
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
その後この更なる増加が下付き文字:
[min((PathSize - 1),CurrentObserverPathPointIndex + 1)]
つくコードを作品に登場したデバッグモードがランダムに未定義の動作に登場す。