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



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

#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 

相关内容

  • 没有找到相关文章

最新更新