设为首页 加入收藏

TOP

C:函数指针数组及驱动表程序解读 (一)
2014-11-24 00:11:49 来源: 作者: 【 】 浏览:58
Tags:函数 指针 驱动 程序 解读

上一节http://www.2cto.com/kf/201205/132375.html解读了C程序中函数指针及回调函数的写法,本节再看一下函数指针另一个较为广泛的应用-驱动表程序,在这之前,首先需要了解函数指针数组的使用,依旧通过最简单最容易理解的例子来讲解。

首先看下面这个函数指针数组的使用实例。


[cpp] #include
#include


int Sum(int a, int b)
{
return a + b;
}

int Sub(int a, int b)
{
return a - b;
}

typedef int (*pfFun)(int, int);

int TestFun(int a, int b, pfFun pf)
{
int i = 0;
i = pf(a, b);
return i;
}

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

pfFun pf[] = {Sum, Sub}; /*定义并一个函数指针数组,包含2个元素,并将其初始化为Sum和Sub函数地址*/

iTmp = TestFun(20, 10, pf[0]);
printf("Tmp is: %d\n", iTmp);

iTmp = TestFun(20, 10, pf[1]);
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;
}

typedef int (*pfFun)(int, int);

int TestFun(int a, int b, pfFun pf)
{
int i = 0;
i = pf(a, b);
return i;
}

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

pfFun pf[] = {Sum, Sub}; /*定义并一个函数指针数组,包含2个元素,并将其初始化为Sum和Sub函数地址*/

iTmp = TestFun(20, 10, pf[0]);
printf("Tmp is: %d\n", iTmp);

iTmp = TestFun(20, 10, pf[1]);
printf("Tmp is: %d\n", iTmp);

system("PAUSE");

return 0;
}
运行一下:


[plain]
Tmp is: 30
Tmp is: 10
请按任意键继续. . .
Tmp is: 30
Tmp is: 10
请按任意键继续. . .

有了上面的概念,让我们通过另一个实例看看驱动表的使用,下面这个小程序几乎每个程序员都应该写过,一个没有考虑精度的加减乘除运算程序,如下:


[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 enum _ENOPCODE
{
OPCODE_ADD = 0, /*加*/
OPCODE_SUB, /*减*/
OPCODE_MULTI, /*乘*/
OPCODE_DIVISION, /*除*/
OPCODE_BUTT
}enOpCode;

/*通过Switch-case语句计算*/
int GetOpResultBySwitch(int a, int b, enOpCode enOp)
{
int iTmp = 0;

switch(enOp)
{
case OPCODE_ADD:
iTmp = Sum(a, b);
break;

case OPCODE_SUB:
iTmp = Sub(a, b);
break;

case OPCODE_MULTI:
iTmp = Multi(a, b);
break;

case OPCODE_DIVISION:
iTmp = Division(a, b);
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;
}
#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 enum _ENOPCODE
{
OPCODE_ADD = 0, /*加*/
OPCODE_SUB, /*减*/
OPCODE_MULTI, /*乘*/
OPCODE_DIVISION, /*除*/
OPCODE_BUTT
}enOpCode;

/*通过Switch-case语句计算*/
int GetOpResultBySwitch(int a, int b, enOpCode enOp)
{
int iTmp = 0;

switch(enOp)
{
case OPCODE_ADD:
iTmp = Sum(a, b);
break;

case OPCODE_SUB:
iTmp = Sub(a, b);
break;

case OPCODE_MULTI:
iTmp = Multi(a, b);
break;

case OPCODE_DIVISION:
iTmp = Division(a, b);

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

评论

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