0

重複の可能性:
C++ でのベクトルを使用した行列演算により、セグメンテーション エラーが発生する

いくつかの値を動的マトリックスに割り当てるために、C++ でこの単純なコードを作成しました。

unsigned N = 1000;
vector<vector<double> > Matrix;

for (unsigned i=0; i<(N-1); ++i) {
    for (unsigned j=0; j<(N-1); ++j) {

        if ((i>(N/4-1) && i<(3*N/4-1)) || (j>(N/4-1) && j<(3*N/4-1)))
            Matrix[i][j] = 1;

        else if (i==0 || i==(N-1) || j==0 || j==(N-1))
            Matrix[i][j] = 0;
}
}

コンパイラは問題を返しませんが、プログラムを実行しようとすると、セグメンテーション違反が返されます。私の間違いはどこですか?

ご清聴ありがとうございました。

4

2 に答える 2

1

2 つの空のベクトルを作成しているだけで、operator[]is undefined 動作を使用しています。そのようなことが可能であれば、それらはサイズ 0 の配列のようなものです。

容量のあるベクトルを作成する必要があり、各要素はデフォルトで 0 に初期化されます。

vector<vector<double>> Matrix(N, vector<double>(N));

最初の引数は outer のサイズでvector、2 番目の引数は各要素にコピーする値で、それ自体がNdouble のベクトルです。

于 2012-10-23T17:07:42.437 に答える
0

リストしたコードが問題の原因となっている正確なコードである場合、問題は実際に「マトリックス」にサイズを指定していないことです。

vector<vector<double> > Matrix ( N, vector<double>(N) );

それをするでしょう。

将来的にセグメンテーション違反をデバッグするには、最適化を行わずにデバッグ シンボルをオンにしてコンパイルし、デバッガー (gdb など) で実行して、セグメンテーション後にバックトレースすることから始めます。バックトレースは、助けを求めるときにも役立ちます。

于 2012-10-23T17:07:47.607 に答える