1

プロシージャ アドレスを配列に記録する C コードがあります。

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 は、「エラー: 代入の左オペランドとして左辺値が必要です」と表示します。どうすればこれを修正できますか? 私の目的では、 AnyFunction() を直接呼び出すことはできませんでした。

4

3 に答える 3

3

これは次のように展開されます。

   (type)xxx = ...

これは違法です。ただし、次のようなものを使用できます。

   * (type *)& xxx = ...
于 2011-03-06T12:59:51.977 に答える
0

lpProcAddress[0]の代わりに に直接代入してみてくださいMyFunctionInArray

これは機能するはずであり、そのままにしておくことができます。

ただし、定義を続けて読んでなぜ機能しなかったのかに興味がある場合は、それを行う方法もあります。

あなたがやっていることは#define、ポインター型を MyFunction_TYPE にキャストすることです

1)ポインター配列を何かにキャストする必要は実際にはありません。関数ポインターをそのスロットに割り当てるだけです

2) ポインタ配列を代入する前に本当にキャストしたい場合は、それを関数ポインタ型にキャストする必要があります (逆参照の前に行うので、前に括弧を使用します[0])。

于 2011-03-06T12:51:17.277 に答える
0

lpProcAddress を void* として定義する代わりに、MyFunction_TYPE として定義しないでください。

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

MyFunction_TYPE lpProcAddress[5];

次に、メイン関数で次のことができます。

lpProcAddress[0] = AnyFunction;

キャストを気にする必要はありません。

同様に、関数を呼び出すには、次のようにします。

result = lpProcAddress[0]( some_ptr );
于 2011-03-06T13:05:45.120 に答える