Я столкнулся с тем, что кажется очень неясной ошибкой. Моя программа предполагает зацикливание некоторого кода в течение длительного времени и, в конечном итоге, запуск некоторых функций в цикле. Как ни странно, после того, как я запустил определенную функцию, моя переменная цикла 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
функция.
Запись до начала массива или после конца массива приводит к неопределенному поведению, включая запись переменных, уже находящихся в стеке.
@WhozCraig прав, перезапись стека вызываемой функцией кажется наиболее вероятным объяснением.
Вы должны быть в состоянии узнать в своем отладчике, как взломать any change to the memory at address of z
, это быстро предоставит точный диагноз.
Для Visual Studio (например) см. Вот.