【问题标题】:is it possible for two different recursive voids to call each other in C?两个不同的递归空洞是否可以在 C 中相互调用?
【发布时间】:2020-04-18 15:38:23
【问题描述】:

我正在尝试在 C 中使用两个相互依赖的递归,但是当我编译时出现此错误:

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

[Error] 'Vertical' was not declared in this scope

如果我交换垂直和水平,水平在这个范围内变得未声明

这是我写的代码:

#include <stdio.h>
#include <stdlib.h> 
 void Horizontal(int*m[][1000],int i,int j,int*cpt)
 {
    if(*m[i][j]!=0)
    {
        *m[i][j]=0;
        *cpt++;
        Vertical(&*m,i,j,&*cpt);
        Horizontal(&*m,i,j-1,&*cpt);
        Horizontal(&*m,i,j+1,&*cpt);
    }
 }
 void Vertical(int*m[][1000],int i,int j,int*cpt)
 {
    if(*m[i][j]!=0)
    {
        *m[i][j]=0;
        *cpt++;
        Horizontal(&*m,i,j,&*cpt);
        Vertical(&*m,i-1,j,&*cpt);
        Vertical(&*m,i+1,j,&*cpt);
    }
 }
 int main()
 {

 }

int main() 是空的,因为我只是想检查我的语法

【问题讨论】:

  • 正如答案所说,可以编译它。但是按照您编写的方式,从Horizontal 调用Vertical 保证什么都不做(因为不会输入Vertical 中的if),同样对于从@987654329 调用Horizontal @.
  • 提示:&amp;*cpt 是一种奇怪的写法cpt。

标签: c recursion matrix void


【解决方案1】:

他们可以,但你需要转发声明函数。

像这样:

// Forward declaration:

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

void Vertical( int* m[][1000], int i, int j, int* cpt );

// Function implementation:

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

要允许其他*.c 文件使用这些函数,您可以将这些前向声明放在一个单独的文件(头文件)中,并让您的其他*.c 文件使用该头文件,而链接器会处理其余部分。

【讨论】:

  • 谢谢戴,它成功了,我会在网站允许后立即将其作为答案
  • (技术上,不需要Horizontal 的前向声明。)
  • @ikegami 确实,但我还是把它包括在内了,因为我可能希望在头文件中导出这两个函数。
【解决方案2】:

您需要转发声明您的函数。在Horizontal 函数之前添加:

void Vertical(int*[][1000],int,int,int*);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多