2017-04-10 5 views
-1

の構造体へのポインタを初期化する私はこのトピックに関するSO上で同様のスレッド(How to initialize a Pointer to a struct in C?Initializing a pointer to a structure) を読みますがnewmallocをしようとして失敗しています。私はのtypedef

struct STP_CALLBACKS 
    { 
     STP_CALLBACK_ON_TOPOLOGY_CHANGED  onTopologyChanged; 
     STP_CALLBACK_ALLOC_AND_ZERO_MEMORY allocAndZeroMemory; 
     STP_CALLBACK_FREE_MEMORY    freeMemory; 
     ... 
    }; 

構造を形成して、私は

const STP_CALLBACKS *callbacks = new STP_CALLBACKS; 

で、この構造体へのポインタを初期化したいときには、実際には何もINITSないtypedefs

よう
typedef void (*STP_CALLBACK_ON_TOPOLOGY_CHANGED)  (BRIDGE* bridge); 
typedef void* (*STP_CALLBACK_ALLOC_AND_ZERO_MEMORY)  (unsigned int size); 
typedef void (*STP_CALLBACK_FREE_MEMORY)    (void* p); 
typedef void (*STP_CALLBACK_ENABLE_LEARNING)   (BRIDGE* bridge, unsigned int portIndex, unsigned int treeIndex, bool enable); 

の束を持っています。私はかなり初心者であり、明らかに重要なことを見逃しています。それを行う正しい方法は何ですか?

P.S.上記のコードはmstp-libです。私はVS2015です。

+1

これらは関数ポインタです。 –

+1

何を初期化しますか? – doctorlove

+0

次の関数内で使用する@doctorlove - [STP_CreateBridge](https://sourceforge.net/p/mstp-lib/code/HEAD/tree/trunk/_help/STP_CreateBridge.html) – Alexandr

答えて

1

実際には初期化していません。 typedefは型を宣言するだけです。すべてのnewは4つの関数ポインタのためにメモリを割り当てています。

void func1(BRIDGE* bridge) { 
    ... 
} 

STP_CALLBACKS callbacks(func1, ... 

をしてからコールバック:、...あなたはあなたの構造を初期化することができます関数func1、func2のように呼び出される実際の機能を有する、そして、

struct STP_CALLBACKS { 
    STP_CALLBACKS(STP_CALLBACK_ON_TOPOLOGY_CHANGED _fp1, ... 
... 

:あなたはコンストラクタを必要とし、このメモリを初期化する 関数:

BRIDGE bridge; 
callbacks.onTopologyChanged(&bridge);