我试图将多维数组作为参数传递给函数。这是我的完整代码:
string mes;
mes = "GET /precise/page.html HTTP/1.1\n";
mes += "Host: ";
mes += argv[1]; // URL or IP of webpage
mes += "\n\n";
send(s, mes.c_str(), mes.length(), 0);
我已将#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("%d\t", temp[tempRow][tempCol]) ;
}
printf("\n") ;
}
}
标记为我认为错误。
错误:
----->
我尝试查看this帖子,但无法检测到错误。如果我用这个替换函数原型:
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[][])
它们都不起作用。这是生成的错误
表示类型1:
void transpose( int, int , int [] [int] ) //type 1
void transpose( int , int , int[] [col] ) //type 2
对于类型2:
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) ;
答案 0 :(得分:3)
简而言之,您不能依赖某个编译器。前C99不允许存在多个未知维度的多维数组函数参数。
然而,不要绝望! C使用线性索引来满足这一需求。 There's a great link which covers the topic in detail,但作为对问题的简短回答,您可以按如下方式解决问题:
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("%d\t", temp[tempRow][tempCol]) ;
}
printf("\n") ;
}
}
其中matrix[(tempCol * col) + tempRow]
是为您提供魔力的线性索引,因为C还可以将row
行和col
列的多维数组视为一维数组,即row*col
个元素很长(事实上它实际上是在内存中)。
There's also another SO question discussing accessing an array like this in C
答案 1 :(得分:2)
您需要更改
void transpose( int , int, int[int][int] ) ;
到
void transpose( int row, int col, int[ ][col] ) ;
使用-std=c99
答案 2 :(得分:1)
声明函数就像
一样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