2017-04-20 5 views
0

私はダブルスの2DベクトルからなるC++クラスを扱っています。私は2Dベクトルを作成しようとしていますが、その内部の値を編集しようとするとプログラムがクラッシュします。私は[] []演算子を使用してmyDubと等しく設定しようとしましたが、私はmyMat.editSlot(i、j、myDub)のようなクラスを使用しようとしましたが、どちらもプログラムをクラッシュさせました。ダブルスの2Dベクトルがクラッシュの原因となる

// N == rowsとcolsの#(すべての行列が正方形である) // INFILEが正しく

mat my_mat(n,n); 

// Read input data 
for (int i=0; i<n; i++) { 
    for (int j=0; j<n; j++) { 
     double myDub; 
     inFile >> myDub; 

     my_mat.editSlot(i,j,myDub); 
    } 
} 

ファイルを開き、ここでクラスです:

class mat 
{ 

    mat(int x , int y) { 
     int row = x; 
     int col = y; 
     vector<vector<double>> A(row , vector<double>(row , 0)); 


     for (int i = 0; i<row; i++) 
     { 
      for (int j = 0; j<col; j++) 
      { 
       cout << setw(6) << A[i][j]; 
      } 
      cout << endl; 
     } 
    } 

    void editSlot(int x , int y , double val) { 
     A[x][y] = val; 
    } 
    vector<vector<double>> A; 

private: 
    int n; 

}; 
+0

私たちに表示するには、[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。うまくいけば*ビルド*。 –

+0

ああ、おそらくあなたがそれを持っている範囲で 'A'がどこで宣言されているか考えるべきでしょう。 *そして* '行!= col'(***ローカル変数***の初期化を考慮して' A')を行うとどうなりますか? –

+0

多分、あなたは 'row'カラムの代わりに' col'カラムを持たせることを意図していたかもしれません。 –

答えて

2

はそれが見えますAを初期化する方法が間違っています。

A = vector<vector<double>>(row , vector<double>(row , 0)); 

コンストラクタと編集機能の両方を考慮するもう1つの点はpublic宣言されていません。

+0

これはすぐに尋ねられる問題を解決しますが、コピーペーストプログラミングの例としてはまだまだ良い(または、見方によっては悪い)例です。行をコピーしてわずかに編集するだけで、 'row!= col'の場合に起こる微妙で重要なバグはなくなりました。 –

+0

@Someprogrammerdude - OPは、データが強く型付けされ、一貫性があり、行が常にcolと等しいことを既に言及しています。この場合、それは何も心配していません。 – tinstaafl

+0

この特定のテストケースで真ですが、ある機能を使用する可能性がある場合は、いつか使用されます。 –

0

クラッシュにつながる主な問題は、クラスオブジェクトのフィールドとして宣言したベクトルには触れず、コンストラクタ内で一時的なベクトルAのサイズを変更することです。 私はこのような何かをやってお勧め:

mat(int x,int y) : A(y,vector<double>(x,0)) { 
int row = x; 
int col = y; 
    for(int i=0; i<row; i++) 
      { 
       for(int j=0; j<col; j++) 
       { 
        cout<<setw(6)<<A[i][j]; 
       } 
       cout<<endl; 
      } 
     } 
} 

を使用すると、コンストラクタ関数の時間的オブジェクトとクラスで自分のフィールドを非表示にしません。この場合。 また、関数内のxとyを入れ替えないように注意してください。たとえば、あなたがeditSlot機能にエラーがあります:

void editSlot(int x , int y , double val) { 
    A[x][y] = val; 
} 

を、それは次のようになります。

A[y][x] = val; 

コンストラクタによります。

関連する問題