2011-01-18 69 views
2

我無法理解我的程序中有什麼問題。我有這樣的輸入數據:陣列填充錯誤

01000 
11110 
01000 

我想把它保存到:vector< vector<int> > matrix;

vector< vector<int> > fillMatrix(vector< vector<int> > matrix, int height, int width, ifstream &read) 
{ 
    // Make 2d-array [matrix] 
    matrix.resize(width); 
    for (int i=0; i < width; ++i) 
     matrix[i].resize(height); 

    // Fill it up with data 
    for (int i=0; i < height; ++i) 
    { 
     std::string tempLine; 
     std::getline(read, tempLine); 
     for (int j=0; j < tempLine.length(); ++j) 
     { 
      // This shows right information 
      //std::cout << tempLine[j] << " - " << (int)(tempLine[j] - '0') << "\n"; 
      matrix[i][j] = (int)(tempLine[j] - '0'); 
     } 
    } 

    return matrix; 
} 

matrix = fillMatrix(matrix, 3, 5, ifstreamHandle); 

而現在,函數顯示矩陣:

void showMatrix(vector< vector<int> > matrix, int width, int height) 
{ 
    // Show the matrix 
    for (int i=0; i < height; ++i) 
    { 
     for (int j=0; j < width; ++j) 
     { 
      std::cout << matrix[i][j]; 
     } 
     std::cout << "\n"; 
    } 
} 

showMatrix(matrix, 5, 3); 

showMatrix結果:

01000 
11100 
01000 

第二排有錯過'1'。怎麼了?

+3

你應該真的通過引用傳遞矩陣。當你按值傳遞時,它會不必要地複製整個矩陣。 – 2011-01-18 22:30:24

回答

3

創造一個像matrix[i].resize(3)i = 0..4矩陣,但寫了進去。當你初始化向量,你的寬度和高度都是錯誤的。當您稍後從最後兩列讀取時,結果將不確定。

matrix.resize(width); 
for (int i=0; i < width; ++i) 
    matrix[i].resize(height); 

應該

以不同的順序
matrix.resize(height); 
for (int i=0; i < height; ++i) 
    matrix[i].resize(width); 

fillMatrix功能有widthheight到在你後面showMatrix調用它。我建議交換fillMatrix中的訂單以保持其與showMatrix中的相同。

小心填充每行最多爲tempLine.length,這可能會大於width這將導致異常。您也可以從showMatrix中的矢量中獲取寬度和高度,而不是將這些作爲參數。正如@Charles所說,你應該真的通過引用來傳遞向量,以避免複製。 fillMatrix中的矢量參數目前相當無用,因爲您必須將其返回,除非將其轉換爲參考並使其功能void

3

首先你是不是在你的代碼一致

for (int i=0; i < width; ++i) 
... 
for (int i=0; i < height; ++i) 

所以你正在使用matrix[i][j]其中i = 0..2j=0..4