C++ 因为循环变量似乎无缘无故地下地狱?
我遇到了一个似乎很模糊的错误。我的程序需要长时间循环一些代码,最后在循环中运行一些函数。奇怪的是,在我运行了一个特定的函数之后,我的for循环变量“z”从3200跳到1059760811左右(它每次都会改变)。函数不自然地使用循环变量,所以我真的不知道这里发生了什么 整个代码太长,无法粘贴到此处,因此我将尝试仅粘贴重要部分,首先粘贴相关函数,然后粘贴for循环:C++ 因为循环变量似乎无缘无故地下地狱?,c++,loops,for-loop,corruption,C++,Loops,For Loop,Corruption,我遇到了一个似乎很模糊的错误。我的程序需要长时间循环一些代码,最后在循环中运行一些函数。奇怪的是,在我运行了一个特定的函数之后,我的for循环变量“z”从3200跳到1059760811左右(它每次都会改变)。函数不自然地使用循环变量,所以我真的不知道这里发生了什么 整个代码太长,无法粘贴到此处,因此我将尝试仅粘贴重要部分,首先粘贴相关函数,然后粘贴for循环: void enterdata(float dpoint,int num){ autodata[num] += dpoi
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; }
}
void enterdata(浮点dpoint,int num){
自动数据[num]+=dpoint;
}
浮点自动相关(){
浮点自相关=0;
for(int a=0;a看起来您的enterdata
函数中可能存在堆栈溢出问题
在数组开始之前或在数组结束之后写入将导致未定义的行为,包括在堆栈上已经存在的变量上写入。看起来您的enterdata
函数中可能存在堆栈溢出问题
在数组开始之前或在数组结束之后写入将导致未定义的行为,包括写入堆栈上已有的变量。@WhozCraig是正确的,调用函数覆盖堆栈似乎是最可能的解释
您应该能够在调试器中找到如何中断地址z处内存的任何更改,这将快速提供准确的诊断
对于Visual Studio(例如),请参见。@WhozCraig是正确的,调用函数覆盖堆栈似乎是最可能的解释
您应该能够在调试器中找到如何中断地址z处内存的任何更改,这将快速提供准确的诊断
(例如)VisualStudio(参见)./P>我将从调试它开始。因为所有似乎通过给定的偏移量将数组设置为一个值,也许您可能会认为偏移是错误的,因此在堆栈变量上行走。(我猜,grid
在堆栈上或附近,z
)。count
在哪里获得用于语句grid.enterdata(grid.autocorr(),count)的值
?你尝试过什么?进入调试器?添加断言?通过valgrind运行它?计数从哪里来?在for
循环中,为什么long
被分配了一个浮点值0.0
?也许你想要0L
?我会从调试它开始。既然所有enterdata()看似通过给定的偏移量将数组设置为一个值,也许您可以考虑偏移是错误的,因此在堆栈变量上行走(并且我猜想“代码>网格在堆栈上,或者在“代码”> Z代码/代码>上)。(grid.autocorr(),count)
?你尝试过什么?进入调试器?添加断言?通过valgrind运行它?计数从哪里来?在for
循环中,为什么long
分配了一个0.0
的浮点值?也许你想要0L
?谢谢大家,基本上就是这样。我确实有originally没有在其类定义中定义autodata数组的大小,而是说float autodata[];我之所以这么做,是因为我试图通过在获得更多点时保持一个运行计数并将其添加到阵列中,从而在定义需要多少数据点时走捷径。我原本以为阵列可以处理这一问题,只需为新点添加更多插槽,但显然不行。谢谢大家,这很基本实际上,我最初并没有在其类定义中定义autodata数组的大小,而是说float autodata[];我这样做是因为我试图通过在获得更多点时保持一个运行计数并将其添加到阵列中,从而在定义需要多少数据点时走捷径。我原本以为阵列可以处理这一问题,只需为新点添加更多插槽,但显然不行。