我有一个像这样的简单程序:
#include<stdio.h>
void add(int *nb)
{
*nb += 1;
}
int f(int nb, void (*add)(int *))
{
if (nb < 5)
f(nb, add(&nb));
return (nb);
}
int main() {
int b = 5;
int a = f(b, add);
printf("%d\n", a);
}
我想递归调用f,直到nb大于或等于5,但是当我编译程序时,gcc编译器显示如下内容:
error: passing 'void' to parameter of incompatible type 'void (*)(int *)'
有人可以帮我吗?
答案 0 :(得分:3)
我不确定您要使用功能做什么,但是我怀疑您可能要做什么:
#include<stdio.h>
void add(int *nb)
{
*nb += 1;
}
int f(int nb, void (*function)(int *))
{
function(&nb);
if (nb < 5)
f(nb, function);
return (nb);
}
int main() {
int b = 5;
int a = f(b, add);
printf("%d\n", a);
}
现在您的函数f
接受一个以int *
作为参数的void函数的函数指针(我将该参数重命名为function
,因此它与您的现有功能add
)。它继续调用该函数,并将指向nb
的指针传递给function
。
您正在做的是将add(&nb)
的结果作为参数传递到函数f
中(该函数为空,因此它不返回任何内容),而不是传递指向功能。
答案 1 :(得分:1)
f(nb, add(&nb));
行没有意义。您需要在某个地方调用该函数,但不要与递归传递函数指针的位置在同一行。
整个程序没有多大意义。我不知道您要做什么,也许与此类似?
#include<stdio.h>
void add(int *nb)
{
*nb += 1;
}
void f(int* nb, void (*add)(int *))
{
add(nb);
if (*nb < 5)
{
f(nb, add);
}
}
int main() {
int a = 5;
f(&a, add);
printf("%d\n", a);
}
由于add
被调用一次,因此将打印6。名称add
作为f
的函数参数也很令人困惑,因此最好为它起一个另外的名字。
答案 2 :(得分:0)
将add(&nb)
作为参数传递,将add
的返回值与参数&nb
一起传递。 f
的函数签名需要一个函数指针,可以将其传递为:
f(nb, add)
此外,即使您实际上试图传递返回的值add
,由于它的类型为void
,这也是未定义的行为。
答案 3 :(得分:0)
正如克里斯蒂安在评论中指出的那样,问题出在递归调用线上:
f(nb, add(&nb));
如果我正确理解,您正在尝试使用作为指针收到的函数来增加nb
;但是,在这里,您首先未更改地传递nb
(并且作为值,而不是通过引用),然后调用add函数。
在第二个参数中,编译器期望一个函数指针,但它接收add(&nb)
函数调用的返回值,即void
。
另外,如果nb <5,则需要返回递归调用。
正确的程序是:
#include<stdio.h>
void add(int *nb)
{
*nb += 1;
}
int f(int nb, void (*add)(int *))
{
if (nb < 5) {
add(&nb);
return f(nb, add);
}
return (nb);
}
int main() {
int b = 1;
int a = f(b, add);
printf("%d\n", a);
}
似乎您正在尝试使用惰性求值,但是C却没有!