2012-10-06 34 views
0

當我發佈一個類似的問題在這裏:系統崩潰賦予新的價值數組

why it crashes when assigning new values to arrays?

但這個時候,我又遇到了陣列的另一個問題。我的代碼是這樣的:

double diff[600][800][3]; 
cv::Mat value (height, width, CV_8UC3); 
double mean[600][800][3]; 
.... 
for (int i =0; i < 5; ++ i) 
{ 
    for (int j = 0; j < 3; ++j) 
    { 
     for (int m = 0; m < 2; ++m) 
     { 
      mean[i][j][m] = 10/m; 
      diff[i][j][m] = abs (value.data[value.cols*i+j]-mean[i][j][m]); 
     } 
    } 
} 

墜毀在該行:

diff[i][j][m] = abs (value.data[value.cols*i+j]-mean[i][j][m]); 

我甚至忽略這一行,只是這樣寫:

double test = abs (value.data[value.cols*i+j]-mean[i][j][m]); 

,它編譯,然後我加了

std::cout << test << std::endl; 

它再次墜毀,而這條線也應聲:

diff[i][j][m] = test; 

我甚至改變這樣的:

double test = static_cast<double>(abs(value.data[value.cols*i+j]-mean[i][j][m])); 
diff[i][j][m] = test; 

再次崩潰。如果我這樣寫:

diff[i][j][m] = 10; 

它編譯。我真的不知道這個問題。似乎這與堆棧溢出或數據類型無關。我甚至嘗試過Aki Suihkonen對我以前的問題的回答,但它無能爲力。有人可以幫我在這裏找到問題嗎?

+2

堆棧上將近300萬雙打。糟糕的堆棧。 – chris

+0

什麼大小是value.data數組?我想你正嘗試訪問你不允許的內存。 – tomahh

+0

@Tom:值的大小是600x800。 –

回答

2
for (int m = 0; m < 2; ++m) 
    { 
     mean[i][j][m] = 10/m; 
     //... 
    } 

這對於m = 0 ..碰撞的可能的原因值導致除零。

+0

@bhuwanshni:我不這麼認爲,即使我試圖給出像「25」這樣的常量值,它也會崩潰,你還有其他想法嗎? –

1

可能double diff[600][800][3];對於您系統的默認堆棧大小來說太大了。如果你有64位的double秒,那麼這是11.5MB,而許多編譯器默認爲1MB的堆棧大小。

嘗試static double diff[600][800][3];而不是,和你的其他大型陣列相同。

如果你真的需要數組是非靜態的(即,如果函數是可重入的),你將需要使用動態分配。