2017-06-02 23 views
1

私はコードを与えられています。私は次の機能を使う必要がありますが、それを呼び出す際に問題があります。C関数ポインタとtypedef

int myFunction(const struct LQuery *pQuery, 
        f_Callback Callback, 
        const void *pPriv); 

そして私は、私はCallbackmy_callbackFunctionへのポインタでなければならないが、私はそれにパラメータを設定する方法を理解するように見えることができないことを理解し、次のように定義さ

typedef void (f_Callback) (int NumOfRecordsFound, 
          void *pPriv, 
          const tL_QueryResult *pData); 

を持っています。私が理解している限り、pQueryはコールバック関数に渡されますが、f_Callbackには3つのパラメータが必要です。

すなわち

int main (int Argc, char *pArgv[]) 
{ 
    myFunction(what should go here and WHY) 
} 
+0

あなたの疑問は何ですか?どのようにコールバックするためのパラメータを渡すか、コールバックを渡す方法は? – LearningC

+0

1)これは定義ではなく宣言です。 2)これはコンパイルされません。関数をパラメータとして渡すことはできません。 'コールバック'は関数ポインタではありません! – Olaf

答えて

3

コールバック関数はmyFunctionから呼び出されます。コールバック関数だけをパラメータとして渡す必要があります。ここでは例です:

#include <stdio.h> 

typedef void (f_Callback)(int a, 
          int b, 
          int c); 

int myFunction(int a, f_Callback* callback) 
{ 
    callback(a, a+1, a+2); 
} 

void myCallback(int a, int b, int c) 
{ 
    printf("a: %d, b: %d, c: %d\n", a, b, c); 
} 

int main() 
{ 
    myFunction(5, &myCallback); 
    return 0; 
} 

予想される出力:

$./a.out 
a: 5, b: 6, c: 7 
+0

@Stargateurポインタが明示的になりました。ありがとう – user3188346

2

のtypedefが正しくありません。

typedef void (*f_Callback) (
       int NumOfRecordsFound, 
       f_Callback Callback, 
       const void *pPriv); 

これは適切なポインター機能です - スターに注意してください。それ以外の場合は、関数プロトタイプの型定義を宣言します。関数プロトタイプは、関数宣言でも機能しますが、変数として使用することはできません。

あなたは

int myFunction(const struct LQuery *pQuery, 
       f_Callback Callback, 
       const void *pPriv); 

のような関数とコールバック

void my_callback_function(int records_found, 
          f_Callback callback, 
          const void *priv) 
{ 
     ... 
} 

を持っている場合は、左辺値my_callback_functionがポインタにに減衰するだけで

myFunction(the_query, my_callback_function, the_private_pointer); 

としてmyfunctionを呼び出すことができます-functionなので、&文字は必要ありません。

+0

typedefは通常 'typedef void(* f_Callback)'として置かれていますが、提供されているコードはコピーされています。どのような場合にうまくいくかについての洞察に感謝します。 –

0
typedef void (f_Callback) (int NumOfRecordsFound, 
          void *pPriv, 
          const tL_QueryResult *pData); 

Cはにそれらを定義宣言機能に、だけにあなたを許可していません。

パーサに関数のエイリアスを挿入することは意味をなさない。

エイリアスは、関数へのポインタとしてのみ定義する必要があります。