广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
SIEMENS海南省三亚市 西门子代理商——西门子华南一级总代理

1 概念提出

所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。

根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。

具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。

例如,用36进制(A表示10,B表示11,…)表示更大的数字,逻辑判断语句如下:

if(ucNum < 10)
{
   ucNumChar = ConvertToChar(ucNum);
}
elseif(ucNum == 10)
{
   ucNumChar = 'A';
}
elseif(ucNum == 11)
{
   ucNumChar = 'B';
}
elseif(ucNum == 12)
{
   ucNumChar = 'C';
}
//... ...
elseif(ucNum == 35)
{
   ucNumChar = 'Z';
}

当然也可以用switch…case结构,但实现都很冗长。而用表驱动法(将numChar存入数组)则非常直观和简洁。如:

CHAR aNumChars[] = {'0', '1', '2', /*3~9*/'A', 'B', 'C', /*D~Y*/'Z'};
CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)];

像这样直接将变量当作下数组下标来读取数值的方法就是直接查表法。

注意,如果熟悉字符串操作,则上述写法可以更简洁:

CHAR ucNumChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ucNum];

使用表驱动法时需要关注两个问题:一是如何查表,从表中读取正确的数据;二是表里存放什么,如数值或函数指针。前者参见1.1节“查表方式”内容,后者参见1.2节“实战示例”内容。


展开全文
相关产品
拨打电话 微信咨询 发送询价