gpt4 book ai didi

C 函数指针错误

转载 作者:行者123 更新时间:2023-12-02 06:02:07 25 4
gpt4 key购买 nike

好吧,我正在尝试学习函数指针。我有一个像这样的基本函数指针设置。

打印链表函数:

void seq_print(Seq seq, void (* print_func)(void *)){
Node * p = seq->top;
if(p == NULL){
printf("%s %c", "There is no data to print.", '\n');
return;
}
while(p != NULL){
print_func(p->data);
p = p->next;
}
}

测试功能:

seq_print(s, printFunc(1));

我收到这个错误:

seq.h:113:32: error: expected declaration specifiers or ‘...’ before ‘(’ token
extern void seq_print(Seq seq, (void *) print_func(void *));

我真的不知道该怎么做,任何见解都会有所帮助。

最佳答案

你有两个错误:

首先,注意报错信息中的声明:在你的头文件seq.h中,函数声明是错误的!

 extern void seq_print(Seq seq, (void *) print_func(void *));
// ^ ^ wrong = parenthesis return type

应该是:

 extern void seq_print(Seq seq, void (*print_func) (void *));
// ^ correct ^ = parenthesis function name

第二,在调用的地方。

seq_print(s, printFunc(1));
// ^^^ you are calling function, and passes returned value

应该是:

seq_print(s, printFunc);
// ^^^^^^^^^^ don't call pass function address

我的以下代码示例将帮助您更好地理解(阅读评论):

#include<stdio.h>
void my_g2(int i, (void*) f(int)); // Mistake: Notice () around void*
void f(int i){
printf("In f() i = %d\n", i);
}
int main(){
my_g2(10, f(1)); // wrong calling
return 0;
}
void my_g2(int i, void (*f)(int)){
printf("In g()\n");
f(i);
}

检查 codepad用于工作代码。你可以看到错误类似于你得到的:

Line 2: error: expected declaration specifiers or '...' before '(' token
In function 'main':
Line 8: error: too many arguments to function 'my_g2'

现在这段代码的正确版本:

#include<stdio.h>
void my_g2(int i, void (*f)(int)); // Corrected declaration
void f(int i){
printf("In f() i = %d\n", i);
}
int main(){
my_g2(10, f); // corrected calling too
return 0;
}
void my_g2(int i, void (*f) (int)){
printf("In g()\n");
f(i);
}

现在检查codepade对于输出:

In g()
In f() i = 10

编辑在评论的基础上添加。

But what if it's like void (*f) (void *) how do I pass in values to that?

在 main() 中调用函数(在我的例子中 = my_g2)你需要传递你想要调用的函数指针(在我的例子中 f())您在 main 中调用的函数(即 my_g2)。

您想从 my_g2() 调用 f()

我们总是在函数调用时传递参数给函数。因此,如果你想将参数传递给 f() 函数,你必须在 my_g2() 中调用它时传递参数。

调用表达式如下(阅读评论):

seq_print(s, printFunc(1));
^ // first printFunc(1) will be called then seq_prints
pass returned value from printFunc(1)

是错误的,因为如果你这样做,seq_print 将被调用,第二个参数值 = 来自函数 printFunc(1) 的返回值。

要传递 void 指针,我的以下代码可能会进一步帮助您:

#include<stdio.h>
void my_g2(void* i, void (*f)(void*));
void f(void *i){
printf("In f(), i = %d\n", *(int*)i);
*(int*)i = 20;
}
int main(){
int i = 10;
my_g2(&i, f);
printf("Im main, i = %d", i);
return 0;
}
void my_g2(void* i, void (*f)(void*)){
printf("In g()\n");
f(i);
}

输出@ codepade :

In g()
In f(), i = 10
Im main, i = 20

关于C 函数指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19310039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com