2013-03-15 74 views
0

我遇到了似乎是一個非常模糊的錯誤。我的程序需要很長時間循環一些代碼,並最終在循環中運行一些函數。奇怪的是,在我運行一個特定的函數後,我的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函數,而不是分別運行每個測試的自相關函數。

我不知道如何解決這個問題,或者是怎麼回事。幫幫我?!?!?

謝謝!

+5

我與*調試啓動*它。由於所有'enterdata()'不看似是將值設置到一個數組被賦予的偏移,或許你可以考慮*偏移*是錯誤的,因此你的堆棧變量走(我猜'grid'是在堆棧上,或者在「z」附近)。 'count'在語句'grid.enterdata(grid.autocorr(),count)中使用的*值*在哪裏? – WhozCraig 2013-03-15 16:02:26

+0

你有什麼試過?步入調試器?增加斷言?通過valgrind運行它? – PlasmaHH 2013-03-15 16:02:30

+0

'count'從哪裏來? – Shoe 2013-03-15 16:04:53

回答

2

看起來你可能有一個堆棧溢出問題在你的enterdata函數。

在數組開始或超過數組末尾之前寫入結果導致未定義的行爲,包括寫入堆棧上已有的變量。

+0

謝謝大家,基本上就是這樣。事實上,我原先沒有定義在它的類定義中的汽車數據數組的大小,而不是說 浮動汽車數據[]; 我這樣做是因爲我試圖通過保持運行計數來定義我需要的數據點的快捷方式,因爲我獲得了更多的點並將它們添加到數組中。我原本以爲陣列會處理這個問題,只是爲新的點添加更多的插槽,但顯然不是。 – aquirdturtle 2013-03-15 16:53:02

1

@WhozCraig是正確的,由被調用的函數堆棧覆蓋似乎是最有可能的解釋。

你應該能夠在你的調試器中找到如何在any change to the memory at address of z上破解,這將很快提供一個確切的診斷。

對於Visual Studio(例如),請參閱here