2011-03-27 171 views
0

我有prinitng這個方法:打印矩陣

void printMatrix(int matrix[][3]){ 
    int i = 0, j = 0; 
    int leni, lenj; 

    leni = sizeof matrix/sizeof matrix[0][0]; 
    lenj = sizeof (matrix[0])/sizeof (matrix[0][0]); 

for(i = 0 ; i < leni ; i++) 
{ 
    for(j = 0 ; j < lenj ; j++) 
    { 
     printf("%d ", matrix[i][j]); 
    } 
    printf("\n"); 
} 
printf("\n"); 

}

和矩陣:

int A[2][3] = {{1, 3, 4}, 
       {2, 0, 1}, 

而且這種方法只寫我,我的矩陣2×3 ,我正在做一個研究,leni和lenj返回相當不好的數字,問題將在void vypisMatice(int matrix[][3]){中,我用矩陣的數量聲明矩陣,但沒有這個數字,編譯器將無法編譯我的應用程序。我只想知道如何調整我的方法,以便在打印時接受任意大小的矩陣,如printMatrix(A);?

感謝

+0

重複:http://stackoverflow.com/questions/5443645/undefined-referenced-to-function-when-trying-to-print-matrix-in-c – 2011-03-27 09:59:30

回答

2

請注意,在函數聲明中,數組類型的任何參數都會轉換爲相應指針類型的參數。

void printMatrix(int matrix[][3]); 

聲明相同功能

void printMatrix(int (*matrix)[3]); 

matrix參數是一個指向3 int的陣列。當您將A傳遞給函數時,實際傳遞的是指向數組的第一個元素的指針,即int (*)[3]

該計算sizeof matrix/sizeof matrix[0][0]給出指針的大小除以int的大小,這與原始數組的成員數量無關。這個數字不能由您傳入的參數確定。您需要將外部數組的維度明確地傳遞給函數。

當你聲明一個數組(即使在函數聲明中它將被轉換爲一個指針類型),數組元素類型必須是一個完整的類型。如果您沒有爲數組類型提供整數常量類型,則該數組的類型不完整。在你的情況下,因爲int[]是一個完整的類型,類型int[][]是非法的,你必須提供所有,但最多的頂級維度在一個多級數組數組類型。如果使用C99功能(注意,不是C++兼容),那麼可以使用變長數組(VLA),但在函數定義中,數組參數的內部數組的長度必須仍然作爲一個額外的參數。

E.g.

void printMatrix(int leni, int lenj, int[][lenj]) 
{ 
    // ... 
} 
0

如果您需要接受任意大小的矩陣,你將需要包括參數printMatrix(),告訴它你的陣列是什麼規模。喜歡的東西:

void printMatrix(int *matrix, int rows, int columns) 

然後你可以使用rowscolumns參數來控制打印例程中的循環,而不是你自己計算它們。

+0

向下選民護理解釋? – 2011-03-27 15:32:16

1

leni = sizeof matrix/sizeof matrix[0][0];它不計算行數。它實際上不計算任何東西。

最好的方法是明確提供leni和lenj作爲附加參數,如void printMatrix(int *matrix, int leni, int lenj)

另外你應該知道,沒有辦法確定一些隨機數組的大小,因爲它只是一個沒有任何元信息的指針。

+0

雖然,將普通的C二維數組傳遞給類型爲「int **」的參數將不起作用。 – 2011-03-27 07:58:14

+0

是的,你可能是對的,當涉及到多維數組時,我略微記得C語法。修復。 – xappymah 2011-03-27 08:02:06