2016-05-13 18 views
0

私はC言語を学習しており、構造体をコールバック関数に渡そうとしています。オンラインリソースを通過しましたが、構造をコールバック関数に渡すことができませんでした。ここに私のコードです。構造体をコールバック関数に引数として渡す方法

// myvariables.h 

struct callbackStruct 
{ 
int a; 
int b; 
int c; 
}; 
extern struct callbackStruct callbackStructObject; 
typedef void (*callback)(struct callbackStruct); 
extern void callback_reg(callback pointerRefCallback); 

// Operations.c 

struct callbackStruct callbackStructObject; 

void callback_reg(callback pointerRefCallback) { 

(*pointerRefCallback)(callbackStructObject); 

} 

// main.c 

struct callbackStruct myCallbackStruct1; 
void my_callback(struct callbackStruct myCallbackStruct) { 

printf("A value:%d" + myCallbackStruct.a); 

} 

int main() 
{ 
callback ptr_my_callback = my_callback(myCallbackStruct1); 
    callback_reg(ptr_my_callback); 
return 0; 
} 

誰でもこのシナリオを解決できますか?

+0

問題を説明できますか? (コンパイラ/リンカのエラー、奇妙な動作...) – purplepsycho

+1

あなたは[MCVE](http://stackoverflow.com/help/mcve)を投稿できますか? – purplepsycho

+1

Wikipediaの記事には、構造体を[コールバック](https://en.wikipedia.org/wiki/Callback_(computer_programming))に渡すCの例があります。 – user3078414

答えて

0

タイプcallbackは、関数ポインタタイプです。その型の変数は、単一のパラメータとしてstruct callbackStructを受け入れる機能を指すポインタです:

typedef void (*callback)(struct callbackStruct); 

ですから、(メインに)書くとき:

// ... 
    callback ptr_my_callback = // HERE 
// ... 

HEREでの発現がなければなりません正しい署名を持つ関数のアドレス。あなたは書く:

my_callback(myCallbackStruct1); 

my_callbackは何も返さない関数(void)とこの関数を呼び出す上記式ですので、表現

callback ptr_my_callback = my_callback(yCallbackStruct1); 

がうまく構文的に(形成され、同様にではありませんタイプシステムの観点から)。

callback ptr_my_callback = &my_callback; 

それはあなたのコードを達成することになっているどのような種類の不明確だ、しかし:my_callbackはあなたがコールバックとして仕事をしたい機能です、あなたはポインタptr_my_callbackにそのアドレスを格納する必要があると仮定すると、

私は本当にあなたをさらに助けることができません。

関連する問題