我遇到了似乎是一個非常模糊的錯誤。我的程序需要很長時間循環一些代碼,並最終在循環中運行一些函數。奇怪的是,在我運行一個特定的函數後,我的for循環變量'z'從3200跳轉到1059760811左右(它每次都會改變)。該函數自然不會使用循環變量,所以我實在不知道這裏發生了什麼。For循環變量去看似沒有理由的地獄?
整個代碼太長,粘貼在這裏,所以我會盡量第一隻粘貼的重要組成部分,與相關職能和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函數,而不是分別運行每個測試的自相關函數。
我不知道如何解決這個問題,或者是怎麼回事。幫幫我?!?!?
謝謝!
我與*調試啓動*它。由於所有'enterdata()'不看似是將值設置到一個數組被賦予的偏移,或許你可以考慮*偏移*是錯誤的,因此你的堆棧變量走(我猜'grid'是在堆棧上,或者在「z」附近)。 'count'在語句'grid.enterdata(grid.autocorr(),count)中使用的*值*在哪裏? – WhozCraig 2013-03-15 16:02:26
你有什麼試過?步入調試器?增加斷言?通過valgrind運行它? – PlasmaHH 2013-03-15 16:02:30
'count'從哪裏來? – Shoe 2013-03-15 16:04:53