将多维数组作为函数参数传递会产生错误

时间:2015-06-19 13:44:07

标签: c function multidimensional-array

我试图将多维数组作为参数传递给函数。这是我的完整代码:

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) ;

3 个答案:

答案 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