我无法在 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);
然而,在我看来,您的代码中还有更多内容需要解决:
- 使用按引用调用或使用全局变量不是您的递归算法应有的工作方式。特别是考虑到您根本不改变该值这一事实。
- 不太明白,你为什么要用函数指针来赋值?事实上,你有一个奇怪的混合静态递归和函数指针的使用。那你到底想达到什么目的呢?
也许您想根据这些评论重新评估您的方法。
为什么你甚至需要指针?如 中所述,您的代码存在很多问题。这个程序应该在没有指针的情况下实现你想要做的事情:
#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_it
和 number
。所以编译器不知道标识符的类型是什么,因此这样的语句是否像这些
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
这是我求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);
然而,在我看来,您的代码中还有更多内容需要解决:
- 使用按引用调用或使用全局变量不是您的递归算法应有的工作方式。特别是考虑到您根本不改变该值这一事实。
- 不太明白,你为什么要用函数指针来赋值?事实上,你有一个奇怪的混合静态递归和函数指针的使用。那你到底想达到什么目的呢?
也许您想根据这些评论重新评估您的方法。
为什么你甚至需要指针?如
#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_it
和 number
。所以编译器不知道标识符的类型是什么,因此这样的语句是否像这些
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