我试图在ARM中创建一个任务队列。基本思想是以下几点。C void *函数指针参数
typedef void (*funcpointer)(void *); // the argument being passed will be a void pointer that I can hopefully typecast
struct sQueue{
funcpointer func_address; // this stores the address of the function to be called
void *func_parameter; // this stores the address of the struct that is passed to the function
uint32_t TimeStamp; // the time at which the function should be called
};
sQueue Func_List[10];
该计划是能够把函数的地址放在Func_List [x] .func_address中。
我希望能够把的接受指向不同结构类型的func_address函数的地址。 下面是一个例子:
void Config_ADC(sADC_Settings *pSettings);
void Enable_RX(sRX_Top_Settings *pSettings);
两个函数都有效地接受一个32位的指针结构,但在这些情况下,结构体是不同的类型。
当我尝试分配Func_List [X] .func_address = Config_ADC编译器会抱怨:
类型的值 “空隙(*)(sADC_Settings *)” 不能被分配给类型 “funcpointer” 的一个实体
关于我如何实现这一点的任何想法?我当然可以改变函数Config_ADC来接受一个void *指针,然后在函数内部对它进行类型转换,但我并不想那么做。
有趣的是它似乎与Func_List [0]一起工作。func =(funcpointer)Config_ADC;新的问题是,Config_ADC实际上是一个类的成员函数,当我尝试做Func_List [1] .func =(funcpointer)DrvRX1.Config_ADC;我得到的错误是“一个指向绑定函数的指针只能用来调用函数”,这是所期望的,因为它在调用函数时必须知道这个指针,反正有这个吗? –
@EoinOConnell这是stil未定义的行为。您正在告诉编译器将您必须的函数指针转换为另一种类型,但您仍然会通过不同类型的指针调用。 – RedX
'C'没有成员函数的概念。请用'C++'标签添加一个新问题。我会避免延伸这个问题,因为它涵盖了一个完整的不同主题。此外,这个问题并不是下一个关闭目标,因为之前已经回答了很多次。最好的方法是搜索和找到这样的东西:http://stackoverflow.com/questions/23184662/call-member-function – harper