在以二维数组作为参数的函数中调用递归 void 会导致错误

标签 c function recursion void

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

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

 }

最佳答案

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

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

当您采用&m时,类型(大致)是int[1000][1000]*,指向由1000个int组成的1000个数组组成的数组的指针s。

Horizo​​ntal中,m的类型是int*[1000][1000],一个由1000个数组组成的数组,每个数组有1000个 int* 。完全不同的类型。

解决方案

不必费心使用指针,因为行为不会有任何不同。

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

void Horizontal(int m[1000][1000],int i,int n,int m1,int j,int*cpt);
<小时/>

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

关于在以二维数组作为参数的函数中调用递归 void 会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59522182/

相关文章:

c - 将 header 添加到 zlib 压缩文件

c - 在C中使用fgets和sscanf在循环后搞乱了程序

c - int 80 不出现在汇编代码中

java - Java内置函数

matlab - Matlab中多变量线性回归的成本函数

python - 递归比较两个目录并标记等效结构

recursion - Prolog:将 2 个列表与其中 1 个未实例化的列表相乘?

php - 加入 Propel 导致递归警告

c - 如何将未终止的字符数组输出到标准输出

objective-c - 2^n 指数计算真的比移位效率低吗?