www.openedv.com
您好,欢迎您!    会员注册 | 登入 
公告:欢迎访问www.openedv.com开源电子网,开源共享共同进步,祝您新年快乐,万事如意!
设为首页 | 加入收藏
论坛首页 » 编程语言学习 前往: 
函数指针作为结构体的成员
发表人 内容
[Down] [Up]
[楼主位] 张洋

等级:NO
注册时间:
2010/12/14 10:47
文章: 337
来自: 广州
离线

     今晚听原子说起函数指针作为结构体成员的用法,很久没去复习过c语言,回来后特地找了个测试程序,发现这种用法有点像java里面的函数调用,思想值得借鉴。
把一些实体定义为结构体变量,而实体的固有属性便是基本数据类型定义的成员变量,而函数指针类型的成员变量可以抽象为你能对这个实体发出的请求,
例如一个遥控器实体,它具备的固有属性为品牌,按键数等等,而你可以发出的请求为按按键发送指令。
#include "stdio.h"   
struct DEMO   //遥控器实体
{  
    char x;   // 按键
    int (*func)(int x,int y); //函数指针    //按按键
};  
 
int add2(int x,int y)   //定义遥控器发送指令
{  
    return x+y;  
}  
 
int dec2(int x,int y)   //定义遥控器发送指令
{  
    return x-y;  
}  
 
struct DEMO demo[2] =   
{  
    {1,add2},       {2,dec2}  
};   
int main(void)
{  
    printf("func%d=%d\n",demo[0].x,demo[0].func(4,3));  
    printf("func%d=%d\n",demo[1].x,demo[1].func(4,3));   
    return 0;  


说明:demo[0],demo[1]可以看做两种不同功能的遥控器实体,
demo[0].x为获取遥控器的固有属性,可以是遥控器的品牌
demo[0].func(4,3)可以抽象为同时按下4,3按键后遥控器的反应;

此源码没有运行过!




这篇文章被编辑了 2 次. 最近一次更新是在 2011/01/27 02:12


希望openedv能给大家提供一个友好的技术交流平台!
[加为好友] 回复 引用回复
[Down] [Up]
[1楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

 
我发一个运行过的源码。
在.h文件中,有如下代码:

//TVM控制状态
typedef struct _m_TVM_CTRL
{
 u32(*get_coin_totval)(void); //得到此次投入硬币总金额
 u32(*get_coin_totcnt)(void); //得到此次投入硬币总数目
 void(*clr_coin)(void);   //清空金额和数目,每次新投币开始执行

 u32(*get_coin_totrval)(void);//得到此次找零的总金额
 u32(*get_coin_totrcnt)(void);//得到此次找零的硬币总数目
 void(*clr_rcoin)(void);   //清空金额和数目,每次新找零开始执行

 void(*clr_hpx)(void);      //清空某个hp中的所有硬币
 void(*thp_add_money)(void);  //将钱数汇总到循环找零hp中,当chg_mode为1的时候,可以执行该函数
  u8  cur_cmd;           //当前指令 0X00,无有效指令;0X32,开始收钱;0X33,硬币回收;0X34,找零;
  u16 cmd_prm;         //指令参数
 u8  cmd_sta;                 //指令执行状态
 m_HP_MESSAGE hp_msg[4];   //每个hopper的状态信息
}m_TVM_CTRL;
extern m_TVM_CTRL     TVM_CTRL;    //控制器

在.c文件中,有如下代码:
//TVM主控制器     
m_TVM_CTRL     TVM_CTRL=    //控制器
{
 get_coin_totval,
 get_coin_totcnt,
 clr_coin,

 get_coin_totrval,
 get_coin_totrcnt,
 clr_rcoin,

 clr_hpx,
 thp_add_money,
  0,
 0,
 0,
 0,  
};
get_coin_totva, clr_coinl等都是在.c文件中存在的函数的函数名。
这样,就完成了TVM_CTRL这个结构体的函数指针初始化,
接下来就可以方便应用了。
比如我要清空TVM的金额,我只需要写:TVM_CTRL.clr_coin();即可。
又比如,我要清空某个HOPPER,只需要写:TVM_CTRL.clr_hpx();
这样可以及其方便的管理某些设备的各个状态。

你可以把任何一个外设都定义为一个结构体,然后在这个里面包含了该外设的所有执行函数,及状态变量。从而非常方便的控制该外设。
更好的是,一旦有任何新增功能,只需要在原来的结构体里面塞函数或者变量就可以了。及其方便维护。







我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[2楼] 张洋

等级:NO
注册时间:
2010/12/14 10:47
文章: 337
来自: 广州
离线

    可以通过这种方法把面向过程(c)和面向对象(java,c++)的思想联系起来!这种思想很实用!



希望openedv能给大家提供一个友好的技术交流平台!
[加为好友] 回复 引用回复
[Down] [Up]
[3楼] levension

等级:NO
注册时间:
2010/12/14 20:31
文章: 12
来自: 广东
离线

结构体可以看成c++里面的类,只是封装性不好而已。


[加为好友] 回复 引用回复
[Down] [Up]
[4楼] levension

等级:NO
注册时间:
2010/12/14 20:31
文章: 12
来自: 广东
离线

附上一个详细的用c实现面向对象的文档。



[加为好友] 回复 引用回复
[Down] [Up]
[5楼] 张洋

等级:NO
注册时间:
2010/12/14 10:47
文章: 337
来自: 广州
离线

回复【4楼】 levension :
-------------------------------
谢谢长老!呵呵!回家好好研究一下!!



希望openedv能给大家提供一个友好的技术交流平台!
[加为好友] 回复 引用回复
[Down] [Up]
[6楼] 张洋

等级:NO
注册时间:
2010/12/14 10:47
文章: 337
来自: 广州
离线

代码已经测试过了,OK!



希望openedv能给大家提供一个友好的技术交流平台!
[加为好友] 回复 引用回复
 
前往: 

Powered by ALIENTEK工作室 © 粤ICP备12000418号-1