0

非常にあいまいなバグと思われるものに遭遇しました。私のプログラムでは、いくつかのコードを長時間ループし、最終的にループ内でいくつかの関数を実行しています。奇妙なことに、特定の関数を実行した後、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 関数であると確信するようになりました。

これを修正する方法、または何が起こっているのかわかりません。ヘルプ?!?!?

ありがとう!

4

2 に答える 2

2

関数にスタック オーバーフローの問題があるようですenterdata

配列の開始前または配列の末尾を超えて書き込むと、既にスタックにある変数を上書きするなど、未定義の動作が発生します。

于 2013-03-15T16:25:44.087 に答える
1

@WhozCraigは正しいです。呼び出された関数によるスタックの上書きが最も可能性の高い説明のようです。

デバッガーでブレークする方法を見つけることができるはずですany change to the memory at address of z。これにより、正確な診断が迅速に提供されます。

Visual Studio (例) については、こちらを参照してください。

于 2013-03-15T16:25:52.260 に答える