我最近刚刚在C中发现了函数指针的魔力,并一直在将一个相当大的switch语句转换成一个很好的函数指针数组。我想使用一个简单的查找表来映射到函数指针数组中,以方便函数调用。
问题是操作码到处都是,它们之间有巨大的差距。我不想要一个巨大的0数组来隔开要索引的opcodearray。内存是一个很大的问题。
例如..。0x0000不是操作码0x0001不是操作码0x0002不是操作码0x0003是操作码
如果不使用下面的OpcodesArray,并且在有效操作码和无效操作码之间有空零,我就无法指向正确的函数。
我的示例使用一个通信接口,该接口根据16位操作码调用一系列函数。此操作码需要调用特定的函数。
例如。
const unsigned int OpcodesArray[] = //array of opcodes
{
0x0008, //opcode 1
0x000B, //opcode 2...
//... more here
//...
0x00FF, //opcode 45
0x01D9, //opcode 46
};
void (*OpCodeFunctionPointerArray[TotalNumberOfStates])() = { //function pointer array
HOST_GEN_GET_REMOTE_NAME, //0x0008
HOST_GEN_SET_SCAN, //0x000B
//.....
HOST_GEN_ERROR_IND, //0x00FF
HOST_SPP_SERVICE_CON, //0x01D9
};
void Process_Packet(void) /* Process and respond to received packet */
{
States.OpCode = 0x00FF; //Example input here
ServiceStateMachine(States.OpCode); //service packet
}
void ServiceStateMachine(unsigned int opCode)
{
OpCodeFunctionPointerArray[opCode](); //unable to do this because
//I don't want a huge array
//full of zeros
}
void HOST_GEN_ERROR_IND(void) //This is the desired function to be called
{
}我希望这是足够的信息。我只是不知道如何获取操作码0x00FF并让它调用适当的函数。我如何获取0x00FF并返回正确的索引,而不会有一个巨大的查找表,其中包含大量的零,将所有有效的数据包与无效的数据包隔开。
谢谢
发布于 2013-07-26 04:07:28
您可以将每一对信息分组到一个struct中,而不是拥有两个单独的相关信息数组
struct operation {
unsigned short opcode;
void (*function)();
};然后,您可以拥有它们的数组:
struct operation opers[] = {
{ <opcode>, <function> },
{ <opcode>, <function> },
...
};要查找操作码,您可以利用它们按操作码排序的事实,并使用二进制搜索:
struct operation *op = bsearch(opers, <number of opcodes>, sizeof(struct operation), op_compar);bsearch使用op_compar函数比较数组的两个元素:
int op_compar(const void *a, const void *b) {
const struct operation *op1 = a, *op2 = b;
return op1->opcode - op2->opcode;
}bsearch应该在对数时间内运行,所以它非常快(与顺序搜索相比)。
发布于 2013-07-26 04:07:23
https://stackoverflow.com/questions/17867391
复制相似问题