0

ここに同様の質問を投稿しました:

新しい値を配列に代入するとクラッシュするのはなぜですか?

しかし、今回も配列に関する別の問題に遭遇しました。私のコードは次のようなものです:

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 の回答も試してみましたが、役に立ちませんでした。誰かがここで問題を見つけるのを手伝ってくれませんか??

4

2 に答える 2

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

これにより、m = 0 の値がゼロで除算されます。おそらくクラッシュの理由です。

于 2012-10-06T10:56:02.760 に答える
1

おそらくdouble diff[600][800][3];、システムのデフォルトのスタック サイズには大きすぎます。64 ビットdoubleの s がある場合、これは 11.5MB ですが、多くのコンパイラはデフォルトで 1MB のスタック サイズに設定されています。

代わりに を試してくださいstatic double diff[600][800][3];。他の大きな配列についても同じです。

配列を非静的にする必要がある場合 (つまり、関数が再入可能である場合) は、動的割り当てを使用する必要があります。

于 2015-07-30T01:02:12.083 に答える