非常にあいまいなバグと思われるものに遭遇しました。私のプログラムでは、いくつかのコードを長時間ループし、最終的にループ内でいくつかの関数を実行しています。奇妙なことに、特定の関数を実行した後、for ループ変数 'z' が 3200 から 1059760811 付近にジャンプします (毎回変化します)。関数は当然ループ変数を使用しないため、ここで何が起こっているのか正直わかりません。
コード全体をここに貼り付けるには長すぎるため、関連する関数を最初に、for ループを後にして、重要な部分のみを貼り付けようとします。
void enterdata(float dpoint,int num){
autodata[num] += dpoint;
}
float autocorr(){
float autocorrelation = 0;
for(int a = 0; a<SIZEX; a++)
{
for(int b = 0; b<SIZEY; b++)
{
if(grid[a][b] == reference[a][b]){autocorrelation++;}
}
}
autocorrelation /= SIZEX*SIZEY;
autocorrelation -= 0.333333333333;
return autocorrelation;
}
for (long z = 0.0; z<MAXTIME; z++)
{
for (long k=0; k<TIMESTEP; k++)
{
grid.pairswap();
}
if (z == autostart_time)
{
grid.getreference();
signal = 1; // signal is used in the next if statement to verify that the autocorrelation has a reference.
}
if ((z*10)%dataint == 0)
{
if (signal == 1) {
//!!! this is the important segment!!!
cout << z << " before\n";
grid.enterdata(grid.autocorr(),count);
cout << z << " after\n";
cout << grid.autocorr() << " (number returned by function)\n";
count++;
}
}
if (z%(dataint*10) == 0) { dataint *= 10; }
}
コードでマークされた「重要なセグメント」から、これは私の出力です:
前は 3200、後は 1059760811、0.666667 (関数が返す数値)
明らかに、関数中に「z」変数に奇妙なことが起こっています。また、それぞれ個別に実行されたテストから、それが自己相関関数ではなく、enterdata 関数であると確信するようになりました。
これを修正する方法、または何が起こっているのかわかりません。ヘルプ?!?!?
ありがとう!