我无法在 C 程序中发现错误 - 无法找到错误

I can't spot the mistake in c program - Can't find the error

这是我求n个数之和的代码,我已经通过尝试实现函数指针用迭代和递归方法解决了它,但找不到错误是什么。

#include <stdio.h>

int num; 

int input(int *a)
{
    scanf("%d", a);
    return 0;
}

int sumOfNNumber(int (*number)(int*))
{
    number(&num);   
    if (num == 0) return 0;
    else  return num + sumOfNNumber(num - 1);
}

int main()
{
    sum_it = 0;
    int (*ptr)(int*) = &input;
    
    int sum_rc = sumOfNNumber(ptr);
    
    printf("%d\n", sum_rc);

    return 0;
}

这是编译器报错,我用的是在线gdb编译器。我也尝试了 VS Code,但错误仍然存​​在。

main.c: In function ‘sumOfNNumber’:
main.c:24:37: warning: passing argument 1 of ‘sumOfNNumber’ makes pointer from integer without a cast [-Wint-conversion]
     else  return num + sumOfNNumber(num - 1);
                                     ^~~
main.c:19:5: note: expected ‘int (*)(int *)’ but argument is of type ‘int’
 int sumOfNNumber(int (*number)(int*))
     ^~~~~~~~~~~~
main.c: In function ‘main’:
main.c:29:5: error: ‘sum_it’ undeclared (first use in this function)
     sum_it = 0;
     ^~~~~~
main.c:29:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:34:25: error: ‘number’ undeclared (first use in this function)
     for(int i = 0; i <= number; i++)
                         ^~~~~~

我想我在实现函数指针时犯了错误,但检查了一下它是正确的。 请帮我指出错误的方法和方法来解决。 谢谢。

好吧,马上回答你的主要问题:编译器告诉它很清楚:

main.c: In function ‘sumOfNNumber’:
main.c:24:37: warning: passing argument 1 of ‘sumOfNNumber’ makes pointer from integer without a cast [-Wint-conversion]
     else  return num + sumOfNNumber(num - 1);

您调用 sumOfNNumber 需要一个函数指针。但是,你传递的是整数运算的结果:

sumOfNNumber(num - 1);

然而,在我看来,您的代码中还有更多内容需要解决:

  1. 使用按引用调用或使用全局变量不是您的递归算法应有的工作方式。特别是考虑到您根本不改变该值这一事实。
  2. 不太明白,你为什么要用函数指针来赋值?事实上,你有一个奇怪的混合静态递归和函数指针的使用。那你到底想达到什么目的呢?

也许您想根据这些评论重新评估您的方法。

为什么你甚至需要指针?如 中所述,您的代码存在很多问题。这个程序应该在没有指针的情况下实现你想要做的事情:

#include <stdio.h>
#include <stdlib.h>

unsigned int input(void)
{
        unsigned int n;
        printf("Unsigned integer: ");
        /* check return value of `scanf` */
        if (scanf("%u", &n) != 1) {
                fprintf(stderr, "Error: invalid unsigned integer\n");
                exit(EXIT_FAILURE);
        }
        return n;
}

unsigned int sum_up(unsigned int n)
{
    if (n <= 1)
            return 1;
    return n + sum_up(n - 1);
}

int main(void)
{
    unsigned int n = input();

    unsigned int sum = sum_up(n);
    printf("%u\n", sum);

    return EXIT_SUCCESS;
}

这些错误信息

main.c: In function ‘main’:
main.c:29:5: error: ‘sum_it’ undeclared (first use in this function)
     sum_it = 0;
     ^~~~~~
main.c:29:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:34:25: error: ‘number’ undeclared (first use in this function)
     for(int i = 0; i <= number; i++)
                         ^~~~~~

意味着您在声明它们之前使用标识符 sum_itnumber。所以编译器不知道标识符的类型是什么,因此这样的语句是否像这些

     sum_it = 0;

     for(int i = 0; i <= number; i++)

有效。

例如你写的main

int main()
{
    sum_it = 0;
    //...

但是变量 sum_it 既没有在 main 中也没有在文件范围内声明。所以编译器会报错。而且除了这条语句之外,这个标识符从未在程序中使用过。

这个错误信息

main.c: In function ‘sumOfNNumber’:
main.c:24:37: warning: passing argument 1 of ‘sumOfNNumber’ makes pointer from integer without a cast [-Wint-conversion]
     else  return num + sumOfNNumber(num - 1);
                                     ^~~

意味着不是将函数指针作为参数传递,因为函数 sumOfNNumbers 声明为

int sumOfNNumber(int (*number)(int*))

它的参数具有函数指针类型 int (*number)(int*),您正在将整数表达式 num - 1 作为参数传递。因此,编译器再次发出错误消息。

如果我没理解错的话,您需要编写一个递归函数,在每次递归调用该函数时计算用户输入的数字总和,直到用户输入零。

如果是这样,那么该函数可以如下面的演示程序所示。

#include <stdio.h>

int input( int *p )
{
    return scanf( "%d", p ) == 1 && *p != 0;
}

long long int sumOfNNumber( int ( *number )( int * ) )
{
    int n;
    
    return number( &n ) ? n + sumOfNNumber( number ) : 0;
}

int main(void) 
{
    printf( "The sum of numbers is %lld\n", sumOfNNumber( input ) );
    
    return 0;
}

如果用户将输入以下数字序列(以用户输入 0 结束)

1 2 3 4 5 6 7 8 9 0

那么程序输出将是

The sum of numbers is 45