2015-10-04 72 views
1

所以我已經通過一些在線問題了解如何設置和填充一個動態的多維數組,我以爲我把它放下了,但由於某種原因,我的函數將不會訪問任何東西(0)列。對於我的測試,我把一個2X2陣列:通過動態分配的矩陣循環

 
2 2 (part of another function that gives the size of the matrix) 
1 2 
3 4 

當我調試它,我只得到

 
1 random# from initializing the array 
3 random# from initializing the array 

我不知道我在做什麼毛病這段代碼,我也是新的C++。

double* matrix_read(const int m, const int n) 
{ 
double **mat = new double*[m]; 

for (int j = 0; j < m; ++j) { 
    mat[j] = new double[n]; 
} 
for (int i = 0; i < m; ++i) { 
    for (int j = 0; j < n; ++j) { 

     cin >> mat[i][j]; 
    } 
} 
double debug = mat[2][2]; 
return *mat; 
} 

在主函數內部,這是我發送給函數的內容。

int x, y, m, n; 
     cin >> x; 
     cin >> y; 
     double *mat_a = matrix_read(x, y); 
     cin >> m; //2nd matrix read in 
     cin >> n; 
     double *mat_b = matrix_read(m, n); 
+0

發表一些更多的代碼 – P0W

+0

@PWW我添加了函數調用以及如何將參數傳遞給函數。 (double debug = mat [2] [2])是我試圖讀取並出錯的調試輸出。 – Motorscooter

+0

您只返回矩陣'return * mat;'的第一行而不是整個矩陣。除了mat [2] [2]',你的2x2數組是無界限的。 – aslg

回答

0

你的矩陣被表示爲一個指針數組,在陣列的每個點的指針,進而,以雙打的陣列。這些陣列中的每一個在內存中都是連續的,但不在其內部。這意味着,mat[0][0]就在mat[0][1]之前。但是mat[1][0]可能處於完全不同的位置。

通過僅返回矩陣的第一行*mat(與mat[0]相同),您將丟失信息。所有你有權訪問的是第一行。

您應該返回整個矩陣。

double** matrix_read(...) { 
    ... 
    return mat; 
} 

(編輯:另外,有人會後刪除矩陣..而且他們必須刪除多個陣列,唉你應該做一個結構包裝器矩陣,或者使用一個單一的陣列,或使用。向量)

+0

感謝您的幫助,我發現我不能這樣做,我需要使用一維數組,並像2D一樣對待它們。我想我會花時間研究如何做到這一點。再次感謝您的幫助。 – Motorscooter