2017-04-20 62 views
0

我正在研究一個由2D矢量雙精度構成的C++類。我即將創建2D矢量,但當我嘗試編輯其中的值時,程序崩潰。我試過使用[] []運算符並將其設置爲等於myDub,並且我嘗試使用像myMat.editSlot(i,j,myDub)這樣的類,並且都導致程序崩潰。2D矢量雙編輯導致崩潰

// n ==可行和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'的位置。 *和*如果'row!= col'會發生什麼(考慮到*** local變量'A'的初始化)。 –

+0

也許你打算讓矢量具有「col」列,而不是「row」列 –

回答

2

它看起來對我來說,你初始化A的方式是錯誤的。嘗試這樣的:

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

另一件考慮構造函數和編輯函數都沒有公開。

+0

雖然這將解決問題所在,但它仍然是一個好的(或不好的,取決於觀點)複製粘貼編程的例子。通過複製粘貼該行並進行輕微的編輯,您錯過了一個微妙而重要的錯誤,如果使用'row!= col',將會發生。 –

+0

@Someprogrammerdude - OP已經提到數據是強類型和一致的,並且行將始終等於列。在這種情況下,不用擔心。 – 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; 
      } 
     } 
} 

在這種情況下,你不會在構造函數時間的目的隱藏在A類領域。 另請注意不要在你的函數中交換x和y。例如,你有一個錯誤在你editSlot功能:

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

,它應該是:

A[y][x] = val; 

根據構造。