错误编译,函数指针

时间:2018-08-28 14:40:18

标签: c compiler-errors

我有一个像这样的简单程序:

#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 *)'

有人可以帮我吗?

4 个答案:

答案 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却没有!