首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于MicroController的C语言稀疏查找表到函数指针数组的映射

基于MicroController的C语言稀疏查找表到函数指针数组的映射
EN

Stack Overflow用户
提问于 2013-07-26 03:45:49
回答 2查看 2.2K关注 0票数 2

我最近刚刚在C中发现了函数指针的魔力,并一直在将一个相当大的switch语句转换成一个很好的函数指针数组。我想使用一个简单的查找表来映射到函数指针数组中,以方便函数调用。

问题是操作码到处都是,它们之间有巨大的差距。我不想要一个巨大的0数组来隔开要索引的opcodearray。内存是一个很大的问题。

例如..。0x0000不是操作码0x0001不是操作码0x0002不是操作码0x0003是操作码

如果不使用下面的OpcodesArray,并且在有效操作码和无效操作码之间有空零,我就无法指向正确的函数。

我的示例使用一个通信接口,该接口根据16位操作码调用一系列函数。此操作码需要调用特定的函数。

例如。

代码语言:javascript
复制
    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并返回正确的索引,而不会有一个巨大的查找表,其中包含大量的零,将所有有效的数据包与无效的数据包隔开。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-07-26 04:07:28

您可以将每一对信息分组到一个struct中,而不是拥有两个单独的相关信息数组

代码语言:javascript
复制
struct operation {
    unsigned short opcode;
    void (*function)();
};

然后,您可以拥有它们的数组:

代码语言:javascript
复制
struct operation opers[] = {
    { <opcode>, <function> },
    { <opcode>, <function> },
    ...
};

要查找操作码,您可以利用它们按操作码排序的事实,并使用二进制搜索:

代码语言:javascript
复制
struct operation *op = bsearch(opers, <number of opcodes>, sizeof(struct operation), op_compar);

bsearch使用op_compar函数比较数组的两个元素:

代码语言:javascript
复制
int op_compar(const void *a, const void *b) {
    const struct operation *op1 = a, *op2 = b;
    return op1->opcode - op2->opcode;
}

bsearch应该在对数时间内运行,所以它非常快(与顺序搜索相比)。

票数 4
EN

Stack Overflow用户

发布于 2013-07-26 04:07:23

  1. 创建的数组比使用的操作码数量稍大(可能是1.5到2倍)。
  2. 创建哈希函数以索引到数组中。
  3. 重新检查哈希索引中的条目。如果不匹配,请查看下一个条目。继续寻找,直到你找到正确的那个。有了足够大的桌子,你不应该有太多的冲突。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17867391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档