2017-10-23 3 views
0

私はポインタと関数ポインタをよく知っていますが、これは混乱します。私は関数を持っていて、ここに関数ヘッダがあります。関数内の関数がポインタと見なされるのはなぜですか?

void report(List*, bool check(Item*, void*), void*);

実際の関数は、ヘッダファイルにプロトタイプと同様に実装されています。メインのプロトタイプはbool check(Item*, void*);です。基本的には、戻り値checkに基づいてリストから項目を報告します。 main.cで関数を呼び出すとき、report(list, check(item, specificArg), arg);を使用します。arg/specificArgが基本的に必要なものであれば、私がvoidポインタを使用している唯一の理由です。しかし、問題は、check(item, specificArg)である場合、コンパイラレポート:

incompatible integer to pointer conversion passing 'bool' to parameter of type 'bool (*)(Item *, void *)'

答えて

1

ではなく関数ポインタを期待しながら、あなたは実際に、関数を呼び出すとreportへの呼び出しにその戻り値を渡しているcheck(item, specificArg)を行います。

正しい呼び出し構文は次のとおり

report(list, check, arg);
+0

さて、このような場合には、どのように私は、私の 'int型とspecificArg'、またはcharを上書きしません'specificArg'がプロトタイプでvoidとして宣言されていれば? – compolo

+0

私が正しく理解していれば、 'report'の中から' arg'を 'specificArg'として' check'を呼び出すのですか?その場合、 'report'から' check(item、arg) 'と呼び、' check'の中で変換を行います。 –

0

プロトタイプ

void report(List*, bool check(Item*, void*), void*); 

は3つの引数を取る関数、

  1. ポインタ関数に名前がList *ことItem *とを取りますboolを返す - このパラメータの名前はcheck
  2. void *で、名前も付けられていません。

あなたが渡している2番目のパラメータはboolあるreport(list, check(item, specificArg), arg)お知らせでそれを呼び出している - check(item, specificArg)への呼び出しの>結果。したがって、不一致。

+0

第2引数は実際には関数ポインタです。 –

0

このプロトタイプが正しくありません:

void report(List*, bool check(Item*, void*), void*); 

void report(List*, bool, Item*, void*, void*); 

このプロトタイプを提案次いで、署名は次のようになります。そして

void report(List* pMyList, Item* pmyItem, void* parm1, void* parm2) 

レポート機能内側:

bool mybool = check(pMyItem, parm1); 

あなたは異なる機能を渡したい場合は、次のプロトタイプを使用することをお勧め:

void report(List*, (bool (*)(Item*, void*)), void*); 
関連する問題