为什么我不能将2D数组传递给这个定义的函数?

时间:2016-04-12 15:49:02

标签: c arrays dynamic

int checkdiag(int arr[][100], int size)
{
    int h=0,i,j,count=0;
    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            if(arr[i][j]==arr[++i][++i])
                count++;
    if(count=size)
        h=1;        
    return(h);
}

此函数应检查我的2D数组,以查看是否所有对角线都是相同的值。最大数组大小为100 x 100。

int 
main(void)  
{
    int r,c,**m,i,j;  
    FILE*in;
    in=fopen("matrix.txt","r");
    fscanf(in,"%d",&r);
    c=r;
    m=(int**)malloc(r*sizeof(int*));

    for(i=0;i<r;i++)
        m[i]=(int*)malloc(c*sizeof(int));

    for(i=0;i<r;i++)
    {   
        for (j=0; j<c; j++)
        {
            fscanf(in,"%d",&m[i][j]);
        }
    }
    fclose(in);
    checkdiag(m,r)
    return(0);
}

3 个答案:

答案 0 :(得分:2)

  

要在C中传递2D作为函数参数,您需要指定数组的长度以及每个数组元素的长度。

您在问题中提供的代码 如果使用C99 那么。否则,您必须指定每个数组元素的长度和长度。

您不能简单地使用变量指定数组长度和元素的长度而不声明这些变量 -

void array_function(int array[][n]);  //Wrong!
void array_function(int array[m][]);  //Wrong!
void array_function(int array[m][n]); //Wrong!

但是,你也可以接受这些变量作为参数,或硬编码你的数组和数组元素的长度 -

void array_function(int n, array[][n])         //Correct!
void array_function(int m, int n, array[m][n]) //Correct!

void array_function(int m, array[m][100])      //Correct!
void array_function(int n, array[100][n])      //Correct!

void array_function(int array[100][100]);      //Correct!
void array_function(int array[100][100]);      //Correct!

接受不同长度的数组 -

  

要传入一个不同大小的函数(长度和元素的长度),您需要指定将数组传递给函数时长度和元素的长度。所以你的函数原型看起来像这样:

void array_function(int m, int n, array[m][n]) //Correct!

使用C99标准,您可以省略第一个大小变量,并允许未知长度的数组,但该数组中的每个数组具有相同数量的元素 -

void array_function(int m, array[][m]) //Correct, with C99!  

但是使用您的代码,我不确定您为什么在您的函数中硬编码值100。如果您计划使用数组并使用对角线做某事,我假设您只会得到方形矩阵。你应该像这样编写你的函数:

void array_function(int size, array[size][size])

void array_function(int size, array[][size])

我建议使用第一个选项,因为它清楚表明您接受方形矩阵。

答案 1 :(得分:1)

多个问题:

首先m中的main类型与arr中的checkDiag类型不符; int **int [][100]int (*)[100]的简写)不兼容。

如果您希望匹配类型,请按以下方式声明m

int (*m)[100]; // m is a *pointer* to a 100-element array of int

然后,当您分配m时,请执行以下操作:

m = malloc( r * sizeof *m ); // allocates space for an r x 100 array of int

此方法的优点是您可以在一个操作中分配整个数组,并保证行是连续的。

请注意,如果r不是100,则不会分配“方形”矩阵。但是,对于您正在做的事情,这不应该是一个很大的问题,因为您只是通过r元素阅读和检查r。但是,如果你想成为一名坚持者,你可以这样做:

 int r;
 // get value of r
 int (*m)[r] = malloc( r * sizeof *m );

这会动态分配r x r int数组。我们使用可变长度数组语法(即使用变量r来定义数组大小)。注意,可变长度数组是用C99引入的,在C2011中是可选的;你需要确保你的实现支持 1

在第二种情况下,您需要从

更改checkDiag的原型
int checkDiag( int arr[][100], int size )

int checkDiag( int size, int arr[][size] )

size必须先申报才能在VLA声明中使用。

在任何一种情况下,只需调用free( m );即可在完成后取消分配数组。

第二个主要问题checkDiag中的这一行:

 if(arr[i][j]==arr[++i][++i])

此行调用未定义的行为;你在序列点之间多次更新i的值,并且你试图在同一个表达式中使用旧的和递增的值(即使这样,它在逻辑上也没有意义)。尝试更多类似的内容:

for ( i = 0; i < size - 1; i++ )
{
  if ( arr[i][i] == arr[i+1][i+1] )
    count++;
}

最后一期

if(count=size)

您想在此使用==代替=;您只是将size分配给count,并且由于结果不为零,因此将h设置为1.将其更改为

if ( count == size )
  h = 1;

或者,您可以完全抛弃h变量,只需编写

return count == size;

<小时/> 1。要以编程方式执行此操作,请查找功能宏__STDC_NO_VLA__,如下所示:

#if defined( __STDC_NO_VLA__ )
#error "VLAs are not available for this implementation!"
#endif

答案 2 :(得分:0)

不确定你想要什么,但我想你想检查主对角线中的所有元素是否相同。在这种情况下,2D阵列在两个维度上必须具有相同的大小。我不知道你正在使用什么语言,但这段代码应该大概做你想要的:

int checkdiag(int** arr, int size)
{
    int d=arr[0][0];
    for(int i=1;i<size;i++)
       if(arr[i][i]!=d)
           return 0;     
    return 1;
}

如果所有对角元素都相同,则返回值为1,否则为0。

要检查所有的diagonales是否相同,你必须对每个对角线进行操作。

编辑然后你可以这样调用这个函数:

int** arr;
int size = 100;
arr=(int**)malloc(size*sizeof(int*));
for(int i=0;i<size;i++)
    arr[i]=(int*)malloc(size*sizeof(int));

//fill array with values
int ret = checkdiag(arr,size);

Edit2: Sice OP分享了更多信息,我更新了checkdiag以使用指针。