2011-03-27 220 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