打印
[C语言]

C语言查表 在表中实现跳转 有没办法实现

[复制链接]
3573|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wen_hau|  楼主 | 2013-7-29 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wen_hau 于 2013-7-30 00:22 编辑

ADDWF        PCL,F
RETLW         0x01;
RETLW         0x02;
goto             TAB_SUB1
RETLW         0x04;
goto             TAB_SUB2
RETLW         0x06;


TAB_SUB1:...... ......
TAB_SUB2:...... ......
                    RETLW 0x00;
汇编中可以在表中插入 goto 这样的跳转,这样可以另外种判断或者其他的程序段, C语言中应该怎么实现?效率最高的C程序怎样实现?swith是一个个值得比较,有没最接近汇编的写法?

意思就是PIC可以  在表中 跳转, 跳转了可以做一些与RETLW         0x01;   不同格式的 比如 给标志之类的事情,而C中 只能 一个array给出来的只是一个数,想实现就必须swith case来一个个比较,效率可见一斑了

四楼给出的方法 网上有看到,感觉 还没的swith的效率高,  看来是没什么好办法了,也就安心了,一直查表的时候都会想这个问题,老不安心,感谢各位大大给出答案







相关帖子

沙发
john_lee| | 2013-7-29 19:25 | 只看该作者
看不懂这种汇编(是PIC的吧?),没法理解楼主的需求。

使用特权

评论回复
板凳
popeye021| | 2013-7-29 19:39 | 只看该作者
C语言一样有goto语句啊,虽然不建议用

使用特权

评论回复
地板
chenbb8| | 2013-7-29 20:36 | 只看该作者
本帖最后由 chenbb8 于 2013-7-29 20:42 编辑

switch有什么不好吗?听说在ARM中只要case的值是连续的就会被优化成函数指针表的形式。
既然这样就直接做一个函数指针表算了。
假设你的case对象是连续的。从0开始到5
enum{NUM0, NUM1, NUM2, NUM3, NUM4, NUM5, NUM6,NUM_SIZE}//这里可以改成你需要的有意义的数字
typedef void (*pTest_t)(void);//定义函数指针的类型
//下面是6个case的处理函数
void NUM0Handle(void){……}
void NUM1Handle(void){……}
……
void NUM6Handle(void){……}

pTest_t  TestTbl[NUM_SIZE] = {NUM0Handle, NUM1Handle……NUM6Handle};

main()
{
..............
        TestTbl[NUM1]();//这样就是执行了一个NUM1对应的函数了
................
}
这种方法就叫查表法:loveliness:

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wen_hau + 1 谢谢答复
5
NE5532| | 2013-7-29 21:29 | 只看该作者
PIC是取巧,用RETLW来做,C语言里恐怕只有用函数指针来做了。

使用特权

评论回复
6
sunhq02| | 2013-7-30 08:54 | 只看该作者
4楼的方法里面,如果数值不是连续的,可以建立一个合适的数据结构,比如散列,然后用数据结构查找对应的函数指针

使用特权

评论回复
7
zwz7219| | 2013-7-30 11:30 | 只看该作者
估计楼主想查“大表”吧,你可以把大表分割为每个不大于255个字节的小表,然后依据条件查某个小表:

const unsigned char Tab0[200] =
{
    赋值语句
};
const unsigned char Tab1[200] =
{
    赋值语句
};
const unsigned char Tab2[200] =
{
    赋值语句
};

unsigned char GetData(unsigned int Index)
{
    switch (Index >>8)
    {
         case 0:
            return Tab0[(unsighed char)Index];
         case 1:
            return Tab1[(unsighed char)Index];
    }
    return Tab2[(unsighed char)Index];
}

数组元素如果是其它数据结构,如 int 或 long 等,可依此类推,但必须保证每个数组的最大尺寸不超过 255,这是由 PIC 单片机特殊的查表方式决定的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

21

帖子

1

粉丝