2011-03-06 13 views
1

と「左辺値は、割り当ての左オペランドとして必要な」私は配列GCCエラーコンパイル時:関数ポインタ

void* lpProcAddress[5]; 

typedef unsigned long (*MyFunction_TYPE) (void*); 
#define MyFunctionInArray ((MyFunction_TYPE) lpProcAddress[0]) 

unsigned long AnyFunction (void* lpPointerToAny) 
{ 
    /* Some Code */ 
    return 0; 
} 
int main() 
{ 
    MyFunctionInArray = 
     AnyFunction; // Displays: "error: lvalue required as left operand of assignment" 
} 

GCCディスプレイ「エラーの手順アドレスを記録するCコードを持っている:左オペランドとして必要と左辺割り当ての "。 これを修正するにはどうすればよいですか? 私の目的のために、私は直接AnyFunction()を呼び出すことができませんでした。

答えて

3

これはに拡大していきます。なぜちょうど例えばMyFunction_TYPE、として定義されていませ

* (type *)& xxx = ... 
0

lpProcAddress[0]MyFunctionInArrayの代わりに直接割り当ててみてください。

これはうまくいくはずです。あなたはそのままこのままにしておくことができます。あなたはそれがで動作しなかった理由に興味がある場合は

、自分のやるあまりにもそのための方法があり、読書を保つ定義:

あなたがMyFunction_TYPEにキャストされ、あなたの#defineにポインタ型をやっているが、あなたが本当にそれに割り当てる前に、ポインタの配列をキャストする場合

1)あなたが本当にいけないものへのポインタの配列をキャストする必要がある、あなただけのそのスロット

2)に関数ポインタを割り当てることができますあなたはそれを関数ポインタ型にキャストしなければなりません(逆参照する前に行う必要がありますので、かっこを使用してください) e [0])。これは法的ではありません

(type)xxx = ... 

+0

NO、lpProcAddressに割り当てる[0]で直接動作しますが、私はまた、配列からプロシージャを呼び出す必要があります:同様にあなたがちょうど行うことができます関数を呼び出す

。私がMyFunction_TYPEなしでMyFunctionInArrayを定義した場合、MyFunctionInArray(param)を書くだけで簡単に呼び出すことはできませんでした。または、MyFunction_TYPEを使用して、同じ関数を2回定義する必要があります。それはGCCの古いバージョンで働いたので私を悩ます(私は変更する必要があった) – Julien

0

代わりの空隙としてlpProcAddressを定義*:

typedef unsigned long (*MyFunction_TYPE) (void*);  

MyFunction_TYPE lpProcAddress[5]; 

は、その後、あなたの主な機能であなただけ行うことができます:

をしかし、あなたのようなものを使用することができます
lpProcAddress[0] = AnyFunction; 

キャスティングには注意する必要はありません。

result = lpProcAddress[0](some_ptr); 
+0

すべての配列要素は同じ型ではないので、他のレコードプロシージャは異なる戻り値、differents呼び出し規約、differentsパラメータを持つことがあります。 – Julien

+0

配列よりもむしろ構造体を使用することは可能ですか? 'struct { MyFunction_TYPE1 fn1; MyFunction_TYPE2 fn2; /* etc */ } 複数のインスタンスが必要な場合は、それらの構造体の配列と可能性があります(共用体もうまくいくでしょう)。 – Imron

+0

はい、これは実現可能ですが、私はこのように考えたことはありませんでした。しかし、私は既に私のメソッドで書かれている各関数に一致する要素の数十の構造体を記述する必要があります。そして、私の定義の隣にtypedefがあります。 – Julien