2 つの間違いがあります。
まず、エラー メッセージの宣言に注意してください。ヘッダー ファイル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);
}
コードパッドで作業コードを確認してください。次のようなエラーが表示されます。
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
編集:コメントに基づいて追加。
しかし、それにvoid (*f) (void *)
値を渡すにはどうすればよいでしょうか?
main() で関数を呼び出す (私の例では = my_g2
) から、呼び出したい関数ポインタ (私の例では )f()
を main で呼び出す関数 (つまり ) から渡す必要がありますmy_g2
。
f()
あなたはから電話したかったmy_g2()
関数呼び出し時に、常にパラメーターを関数に渡します。したがって、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
これを行うと、2 番目のパラメーター value = return value from function で呼び出されるため、間違っています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