【问题标题】:calling a recursive void within a function with 2 dimensional array as the argument results in Error在以二维数组为参数的函数中调用递归 void 会导致错误
【发布时间】:2019-12-29 18:32:24
【问题描述】:

我正在使用一个以二维数组作为参数调用递归函数的函数,但出现此错误:

In function 'void Rivers(int (*)[1000], int, int)':

cannot convert 'int (**)[1000]' to 'int* (*)[1000]' for argument '1' to 'void Horizontal(int* (*)[1000], int, int, int, int, int*)'

这里是函数:

void Rivers (int m[1000][1000],int n,int m1)
 {
    int i,j,z=1,cpt;
    for(i=0;i<n;i++)
    {
        for (j=0;j<m1;j++)
        {
            Horizontal(&m,i,n,m1,j,&cpt);
            printf("river number %d is %d blocks in size\n",z,cpt);
            z++;
        }
    }
}

这里是递归的 void:

void Horizontal(int*m[1000][1000],int i,int n,int m1,int j,int*cpt)
{
    if(i<n && j<m1)
    {
        if(*m[i][j]!=0)
        {
            *m[i][j]=0;
            *cpt++;
            Vertical(&*m,i,n,m1,j,&*cpt);
            Horizontal(&*m,i,n,m1,j-1,&*cpt);
            Horizontal(&*m,i,n,m1,j+1,&*cpt);
        }   
    }

 }

【问题讨论】:

  • 你知道&amp;m 给出了数组/指针参数在堆栈上的位置吗?这很少是你想要的。在没有看到更多代码的情况下,我会说您可能需要 int m[1000][1000] 作为每个函数参数,并传递 m
  • ... int cpt 也是 未初始化 但您正在间接增加它,同样适用:传递 cpt 而不是那些花哨的东西。
  • Weather Vane 当我调用 Horizo​​ntal 时,我的矩阵中的值应该会发生变化,传递 int m[1000][1000] 会在 void 执行结束后恢复所有更改
  • 不,数组衰减为指向其第一个元素的指针。只有一个数组:最初传递给调用者的那个数组,函数通过指针对其进行处理。
  • 但这确实意味着除了第一个值之外所有值都会改变,对吧?

标签: c function recursion void


【解决方案1】:

指向数组的指针不是指针数组。

Rivers 中的m 的类型(大致)是int[1000][1000],一个由1000 个ints 组成的1000 个数组的数组。

当您使用&amp;m 时,类型(大致)是int[1000][1000]*,一个指向1000 个ints 的1000 个数组的数组的指针。

Horizontal 中,m 的类型是int*[1000][1000],这是一个由 1000 个 int*s 组成的 1000 个数组的数组。完全不同的类型。

解决方案

不要打扰指针,因为行为不会有任何不同。

由于调用函数时不会复制数组,因此对Horizontal 中的m 所做的任何更改都将影响Rivers 中的m,而不会使其成为指针。

void Horizontal(int m[1000][1000],int i,int n,int m1,int j,int*cpt);

注意:使用typedef 命名int[1000][1000] 将不起作用。由于二维数组没有保存在 C 类型系统中,即使理论上它们是相同的类型,编译器也会抛出带有 cannot convert 'int (**)[1000]' to 'int (*)[1000][1000]' 的函数调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2021-06-19
    • 2019-05-11
    相关资源
    最近更新 更多