搜索
bottom↓
回复: 12

C语言函数指针问题

[复制链接]

出0入0汤圆

发表于 2009-8-3 16:41:50 | 显示全部楼层 |阅读模式
最近写了一个触摸屏程序,程序中使用函数指针数组实现按键的自动响应,现在把每一屏的按键响应函数的指针放到一个1维数组中:
void (*_Key_Deal_A[4])(void);   //第一屏按键响应函数的函数指针数组
void key_deal_a0() {};          //第一屏第一个键被按下的响应函数,为方便理解,删去了具体处理操作
void key_deal_a1() {};         //...
void key_deal_a2() {};
void key_deal_a3() {};

void (*_Key_Deal_B[4])(void);   //...
void key_deal_b0() {};
void key_deal_b1() {};
void key_deal_b2() {};
...
...
void Init_Touch()       //初始化函数指针数组,在系统初始化时调用
{
  
  _Key_Deal_A[0]=key_deal_a0;
  _Key_Deal_A[1]=key_deal_a1;
  _Key_Deal_A[2]=key_deal_a2;
  _Key_Deal_A[3]=key_deal_a3;
  
  _Key_Deal_B[0]=key_deal_b0;
  _Key_Deal_B[1]=key_deal_b1;
  _Key_Deal_B[2]=key_deal_b2;
}
(之所以没有把所有屏的函数放到一个多维的数组,是因为不同的屏按键可能不一样多,这样可以节约程序空间),然后再把各屏函数指针数组的地址存到一个一指针数组:
void *Key_Deal_Tab[SCREEN_NUM]={&_Key_Deal_A,&_Key_Deal_B,...};
请问,该指针数组的类型是不是必须定义成void?
又该怎样通过Key_Deal_Tab调用各个处理函数呢,C语言中能不能实现?

本人是学生,查了不少书,没找到解决方案,希望得到各位前辈指点,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2009-8-3 19:34:51 | 显示全部楼层
只有自己顶起

出0入0汤圆

发表于 2009-8-3 20:52:02 | 显示全部楼层
_Key_Deal_A[]之类已经是指针数组,Key_Deal_Tab[SCREEN_NUM]是指向指针的指针数组。

出0入0汤圆

 楼主| 发表于 2009-8-3 21:44:14 | 显示全部楼层
通过Key_Deal_Tab要怎样调用处理函数呢?

出0入0汤圆

 楼主| 发表于 2009-8-3 21:59:53 | 显示全部楼层
自己顶起,期待回复

出0入0汤圆

发表于 2009-8-4 10:28:28 | 显示全部楼层
处理这个问题可以考虑有二重指针。

以下是测试代码,在 VC++6.0运行通过


=============================================================


#include <stdio.h>

void (*_Key_Deal_A[4])(int);
// 函数的功能是单纯的打印输出
void key_deal_a0(int a)
{
        printf("\n_Key_Deal_A : key_deal_a0");
        printf("\nparam : %d",a);
}
void key_deal_a1(int a)
{
        printf("\n_Key_Deal_B : key_deal_b0");
        printf("\nparam : %d",a);
}
void key_deal_a2(int a) {}
void key_deal_a3(int a) {}

void (*_Key_Deal_B[3])(void);
void key_deal_b0(void)
{
        printf("\n_Key_Deal_B : key_deal_b0");
}
void key_deal_b1(void) {}
void key_deal_b2(void) {}

void Init_Touch()       //初始化函数指针数组,在系统初始化时调用
{
   
  _Key_Deal_A[0]=key_deal_a0;
  _Key_Deal_A[1]=key_deal_a1;
  _Key_Deal_A[2]=key_deal_a2;
  _Key_Deal_A[3]=key_deal_a3;
   
  _Key_Deal_B[0]=key_deal_b0;
  _Key_Deal_B[1]=key_deal_b1;
  _Key_Deal_B[2]=key_deal_b2;  
}


void print_i(void* arg)
{
        printf("%s",(char*)arg);
}

int main(int argc,char **argv)
{
        int i;
        void *Key_Deal_Tab[10]={(void*)&_Key_Deal_A,(void*)&_Key_Deal_B};
       
        void (**p)(int);
        void (**q)(void);

        Init_Touch();
       
        p = Key_Deal_Tab[0];
        q = Key_Deal_Tab[1];
        // 遍历 deal a 中所有函数
        for (i=0;i<4;i++)
                (**(p+i))(20);
        // 遍历 deal b 中所有函数
        for (i=0;i<3;i++)
                (**(q+i))();

        return 0;
}

出0入0汤圆

发表于 2009-8-4 10:56:46 | 显示全部楼层
个人更喜用结构体,数组混合用,而不是一味用多维数组。

数组元素是结构体指针 》 结构体指针指向结构体 》结构体元素是函数指针数组 》函数指针数组元素是函数指针 》函数指针指向需要运行的函数。

出0入0汤圆

发表于 2009-8-4 16:02:28 | 显示全部楼层
欢迎加入单片机QQ群 90850907

讨论单片机方面的技术问题

或上http://www.eehome.cn/?a=include下载单片机方面的资料

出0入0汤圆

 楼主| 发表于 2009-8-5 09:02:04 | 显示全部楼层
问题解决了
首先使用了 typedef void (*KEY_DEAL_F)();
然后把Key_Deal_Tab定义成:
KEY_DEAL_F *Key_Deal_Tab[SCREEN_NUM]={_Key_Deal_A,_Key_Deal_B};
最后调用函数如下:
void Touch_Deal()
{
  unsigned int xy[2];
  Get_TouchXY(xy);
  unsigned int i=Get_Screen_Num();
  int j=Get_KeyNum(xy[1],xy[0],KEY_TAB,MAX_KEY_NUM);
  if(j>=0)  (*Key_Deal_Tab[j])();    //如果有效区域被按下,根据键值查找处理函数
}

谢谢Etual!

出0入0汤圆

发表于 2009-8-23 19:56:08 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-8-26 13:33:41 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-8-30 19:03:59 | 显示全部楼层
搞得有点晕了...

出0入0汤圆

发表于 2013-8-13 11:37:21 | 显示全部楼层
涉嫌过度设计
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 16:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表