我正在尝试将多维数组作为参数传递给函数。这是我的完整代码:
#include <stdio.h>
----> void transpose( int , int, int[int][int] ) ;
void main() {
int row = 0, col = 0 ;
int tempRow = 0, tempCol = 0 ;
printf("nEnter no of rows and colummns in the matrix :t") ;
scanf("%d %d", &row, &col) ;
int matrix [row][col] ;
printf("n") ;
for ( tempRow ; tempRow < row ; tempRow++) {
for ( tempCol ; tempCol < col ; tempCol++) {
scanf("%d" , &matrix[ tempRow][ tempCol] ) ;
printf("t") ;
}
printf("n") ;
}
-----> transpose(row, col, matrix) ;
}
-----> void transpose(int row, int col, int matrix[row][col]) {
int temp[row][col] ;
int tempRow = 0 , tempCol = 0 ;
for( tempRow ; tempRow < row ; tempRow++) {
for( tempCol ; tempCol < col ; tempCol++) {
temp[tempRow][tempCol] = matrix[tempCol][tempRow] ;
printf("%dt", temp[tempRow][tempCol]) ;
}
printf("n") ;
}
}
我已经标记了我认为错误所在的地方----->
。
错误:
matrixTranspose.c:3:32: error: expected expression before ‘int’
void transpose( int , int, int[int][int] ) ;
^
matrixTranspose.c:22:6: warning: conflicting types for ‘transpose’ [enabled by default]
void transpose(int row, int col, int matrix[row][col]) {
^
matrixTranspose.c:19:2: note: previous implicit declaration of ‘transpose’ was here
transpose(row, col, matrix) ;
我尝试查看这篇文章,但无法检测到错误。另外,如果我用这个替换函数原型:
void transpose( int, int, int[][])
然后它说函数定义不完整。
那么我如何传递一个可变大小的多维数组(可能通过避免指针)?
编辑:
我之前已经尝试过这些修改:
void transpose( int, int , int [] [int] ) //type 1
void transpose( int , int , int[] [col] ) //type 2
它们都不起作用。这是生成的错误
对于类型 1 :
matrixTranspose.c:3:34: error: expected expression before ‘int’
void transpose( int , int, int[][int] ) ;
^
matrixTranspose.c:22:6: warning: conflicting types for ‘transpose’ [enabled by default]
void transpose( int row, int col, int matrix[row][col]) {
^
matrixTranspose.c:19:2: note: previous implicit declaration of ‘transpose’ was here
transpose(row, col, matrix) ;
对于类型 2 :
matrixTranspose.c:3:34: error: ‘col’ undeclared here (not in a function)
void transpose( int , int, int[][col] ) ;
^
matrixTranspose.c: In function ‘main’:
matrixTranspose.c:19:2: error: type of formal parameter 3 is incomplete
transpose(row, col, matrix) ;
^
matrixTranspose.c:19: confused by earlier errors, bailing out
Preprocessed source stored into /tmp/ccasypOi.out file, please attach this to your bugreport.
简而言之,你不能不依赖某个编译器。Pre-C99 不允许存在多个未知维度的多维数组函数参数。
但是,不要绝望!C 语言使用线性索引来满足这一点。有一个很好的链接,详细介绍了该主题,但作为对问题的简短回答,您可以按如下方式解决问题:
void transpose(int row, int col, int matrix[])
{
int temp[row][col] ;
int tempRow = 0 , tempCol = 0 ;
for( tempRow ; tempRow < row ; tempRow++)
{
for( tempCol ; tempCol < col ; tempCol++)
{
temp[tempRow][tempCol] = matrix[(tempCol * col) + tempRow] ;
printf("%dt", temp[tempRow][tempCol]) ;
}
printf("n") ;
}
}
其中matrix[(tempCol * col) + tempRow]
是为您创造魔力的线性索引,因为 C 还可以将row
行和col
列的多维数组视为一维数组,该数组row*col
元素长(实际上它在内存中)。
还有另一个 SO 问题在 C 中讨论访问这样的数组。
你需要改变
void transpose( int , int, int[int][int] ) ;
自
void transpose( int row, int col, int[ ][col] ) ;
并使用-std=c99
进行编译
声明函数,就像
void transpose( int row, int col, int[][col] ) ;
前提是您的编译器支持可变长度数组。
接近您尝试声明函数的另一种方式是
void transpose( int , int , int [][*] );
这是一个演示程序
#include <stdio.h>
void f( int , int , int [][*] );
int main(void)
{
int row = 10;
int col = 10;
int a[row][col];
f( row, col, a);
for ( int i = 0; i < row; i++ )
{
for ( int j = 0; j < col; j++ ) printf( "%2d ", a[i][j] );
printf( "n" );
}
return 0;
}
void f( int row, int col, int a[][col] )
{
for ( int i = 0; i < row; i++ )
{
for ( int j = 0; j < col; j++ ) a[i][j] = i * col + j;
}
}
程序输出:)
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99