微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我无法发现 c 程序中的错误 - 找不到错误

如何解决我无法发现 c 程序中的错误 - 找不到错误

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

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

,

这些错误信息

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++)

有效。

例如在你写的主要内容

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
,

为什么你甚至需要指针?如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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。