2011-03-06 71 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

这将扩大到:

(type)xxx = ... 

这是不合法的。但是,您可以使用类似:

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

尝试直接分配给lpProcAddress[0]而不是MyFunctionInArray

这应该工作,你可以保持这种方式。

但是,如果你有兴趣,为什么它没有与工作中的定义继续看下去,有一种方法来做到这一点:

你在做什么你#define被蒙上了指针式到MyFunction_TYPE

1)你不真的需要转换指针数组的任何东西,你可以指定函数指针到它的插槽

2)如果你真的想分配到它之前转换指针数组你必须将它转换为函数指针类型(并且在解引用前这样做,所以使用括号括起来e [0])。

+0

NO,分配给lpProcAddress [0]直接工作,但我还需要从数组调用过程。如果我没有MyFunction_TYPE定义MyFunctionInArray,我不能通过编写MyFunctionInArray(param)轻松调用它,或者我必须定义两次相同的“函数”,一次使用MyFunction_TYPE,一次不使用。它使我恼火,因为它工作在GCC的旧版本上(我被迫改变) – Julien 2011-03-06 13:01:53

0

而不是定义lpProcAddress为void *的,为什么不只是定义为MyFunction_TYPE,例如:在主函数

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

MyFunction_TYPE lpProcAddress[5]; 

然后,你可以这样做:

lpProcAddress[0] = AnyFunction; 

无需关心铸造。

同样打电话,那么你可以做的功能:

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

因为每个数组元素都不是相同的类型,其他记录过程可能有不同的返回值,不同的调用约定和不同的参数。 – Julien 2011-03-06 13:19:28

+0

那么使用结构体而不是数组是可行的,例如: 'struct { MyFunction_TYPE1 fn1; MyFunction_TYPE2 fn2; /*等*/ } ' 然后可能和这些结构的数组,如果需要多个实例(工会也会很好地工作)。 – Imron 2011-03-06 13:23:44

+0

是的这是可行的,我从来没有这样想过。但是我将不得不写一个与我已经用我的方法写过的每个函数匹配的数十个元素的结构。更喜欢在我的定义旁边有typedef。 – Julien 2011-03-06 13:38:25

相关问题