我遇到了一个看似非常模糊的错误。我的程序涉及循环一些代码很长一段时间,并最终在循环中运行一些函数。奇怪的是,在我运行一个特定的函数后,我的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函数,而不是单独运行每个测试的自相关函数。
我不知道如何解决这个问题,或者发生了什么。帮助?!?!?
谢谢!
答案 0 :(得分:2)
您的enterdata
功能可能会出现 Stack Overflow 问题。
在数组开始之前或在数组结束之前写入会导致未定义的行为,包括写入已经存在于堆栈中的变量。
答案 1 :(得分:1)
@WhozCraig是对的,被调用函数覆盖的堆栈似乎是最可能的解释。
您应该能够在调试器中找到如何打破any change to the memory at address of z
,这将很快提供准确的诊断。
对于Visual Studio(例如),请参阅here。