2012-10-06 28 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];而不是,和你的其他大型阵列相同。

如果你真的需要数组是非静态的(即,如果函数是可重入的),你将需要使用动态分配。