Как указал Кристиан в комментариях, проблема в рекурсивной линии вызова:
f(nb, add(&nb));
Если я правильно понимаю, вы пытаетесь увеличить nb
, используя функцию, которую вы получаете в качестве указателя; однако здесь вы сначала передаете nb
без изменений (и как значение, а не по ссылке), а затем вызываете функцию добавления.
Во втором аргументе компилятор ожидает указатель на функцию, но вместо этого он получает возвращаемое значение вызова функции add(&nb)
, которое равно void
.
Кроме того, если nb <5, вам необходимо вернуть рекурсивный вызов. </p>
Правильная процедура будет:
#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 его нет!