设为首页 加入收藏

TOP

C:函数指针数组及驱动表程序解读 (二)
2014-11-24 00:11:49 来源: 作者: 【 】 浏览:59
Tags:函数 指针 驱动 程序 解读
break;
default:
iTmp = -1;
}

return iTmp;
}

int main(int argc, char *argv[])
{
int iTmp = 0;
int a = 10;
int b = 30;

iTmp = GetOpResultBySwitch(a, b, OPCODE_ADD);

printf("Tmp is: %d\n", iTmp);

system("PAUSE");
return 0;
}
程序看上去很清晰,但如果要扩展一下功能,就发现要增加更多的case语句,记得ansi c标准中case的最大个数是256个,暂且不论这个值到底是多少,从代码本身来看,增加过多的case使得圈复杂度不断上升,程序维护困难加大。

这时就可以考虑使用驱动表的方法,同样看一下实现,请关注GetOpResultByTable函数。


[cpp]
#include
#include

/*加法*/
int Sum(int a, int b)
{
return a + b;
}

/*减法*/
int Sub(int a, int b)
{
return a - b;
}

/*乘法*/
int Multi(int a, int b)
{
return a * b;
}

/*除法*/
int Division(int a, int b)
{
return (b == 0) 0:(a / b);
}

/*定义函数指针*/
typedef int (*pfFun)(int, int);

/*操作码*/
typedef enum _ENOPCODE
{
OPCODE_ADD = 0, /*加*/
OPCODE_SUB, /*减*/
OPCODE_MULTI, /*乘*/
OPCODE_DIVISION, /*除*/
OPCODE_BUTT
}enOpCode;

/*使用驱动表计算*/
int GetOpResultByTable(int a, int b, enOpCode enOp)
{
if (OPCODE_BUTT == enOp)
{
return -1;
}
pfFun pf[OPCODE_BUTT] = {Sum, Sub, Multi, Division};
return pf[enOp](a, b);

}

int main(int argc, char *argv[])
{
int iTmp = 0;
int a = 10;
int b = 30;

iTmp = GetOpResultByTable(a, b, OPCODE_ADD);
printf("Tmp is: %d\n", iTmp);

system("PAUSE");
return 0;
}
#include
#include

/*加法*/
int Sum(int a, int b)
{
return a + b;
}

/*减法*/
int Sub(int a, int b)
{
return a - b;
}

/*乘法*/
int Multi(int a, int b)
{
return a * b;
}

/*除法*/
int Division(int a, int b)
{
return (b == 0) 0:(a / b);
}

/*定义函数指针*/
typedef int (*pfFun)(int, int);

/*操作码*/
typedef enum _ENOPCODE
{
OPCODE_ADD = 0, /*加*/
OPCODE_SUB, /*减*/
OPCODE_MULTI, /*乘*/
OPCODE_DIVISION, /*除*/
OPCODE_BUTT
}enOpCode;

/*使用驱动表计算*/
int GetOpResultByTable(int a, int b, enOpCode enOp)
{
if (OPCODE_BUTT == enOp)
{
return -1;
}
pfFun pf[OPCODE_BUTT] = {Sum, Sub, Multi, Division};
return pf[enOp](a, b);

}

int main(int argc, char *argv[])
{
int iTmp = 0;
int a = 10;
int b = 30;

iTmp = GetOpResultByTable(a, b, OPCODE_ADD);
printf("Tmp is: %d\n", iTmp);

system("PAUSE");
return 0;
}
实现相当简单,如果增加其他操作等功能,仅需要扩展pf数组,程序圈复杂度不会随功能增多而增加,从而也降低了维护成本。


附:圈复杂度概念,来自百度百科:http://baike.baidu.com/view/3553594.htm


圈复杂度
概念
  所谓圈复杂度是一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

计算
  它的计算方法很简单,计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式为:V(G)=区域数=判定节点数+1。   h r0U&T#@-g o,J o114943 对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。判定节点在模块的控制流图中很容易被识别出来,所以,针对程序的控制流图计算圈复杂度V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单。

摘自 Socrates的专栏

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C:返回值为指针的函数解读 下一篇C:函数指针解读

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: