【问题标题】:I can't spot the mistake in c program - Can't find the error我在 c 程序中找不到错误 - 找不到错误
【发布时间】:2021-07-01 04:21:19
【问题描述】:

这是我查找 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++)
                         ^~~~~~

我认为我在实现函数指针时犯了错误,但检查它并正确。 请通过指出错误的意思和是帮助我解决。 谢谢。

【问题讨论】:

  • 阅读错误信息。例如,此错误消息“错误:'sum_it' undeclared (first use in this function)”有什么不清楚的地方?
  • 对不起,函数指针和递归结合的错误。

标签: c recursion compiler-errors function-pointers function-definition


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这些错误信息

    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
    

    【讨论】:

      【解决方案3】:

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

      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. 我不太明白,为什么你打算使用函数指针来进行赋值?事实上,你有一个奇怪的静态递归和函数指针使用的混合体。那么你到底想达到什么目标呢?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2023-03-20
        • 2015-02-08
        • 1970-01-01
        • 2013-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多