我最近刚刚发现了 C 中函数指针的魔力,并且一直在将一个相当大的 switch 语句转换为一个很好的函数指针数组。我想使用一个简单的查找表映射到函数指针数组中,以便于函数调用。
问题是操作码到处都是,它们之间有巨大的差距。我不想要一个巨大的 0 数组来分隔操作码数组以进行索引。内存是一个大问题。
例如... 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 并返回正确的索引,而无需使用大量零将所有有效数据包与无效数据包隔开的巨大查找表。
谢谢