原创 编程日志 函数指针 传递参数

2011-2-17 16:31 2267 12 13 分类: MCU/ 嵌入式

函数指针数组 声明

方式1:直接声明

void fun0(u8 ucValue){}
void fun1(u8 ucValue){}
void fun2(u8 ucValue){}

void (*fun[])(u8 ucValue)=
{
    fun0,
    fun1,
    fun2
};
    如果要调用该函数指针 必须放到函数中执行 (* fun[0])(1);

直接在函数外存放,否则出错

提示

error:  the size of an array must be greater than zero

 


方式2 用typedef 先声明新类型,再声明

typedef void (*fun1212)(u8 ucValue);

void fun0(u8 ucValue){}
void fun1(u8 ucValue){}
void fun2(u8 ucValue){}
fun1212 funx[10] =
{
    fun0,
    fun1,
    fun2
};
void (*fun[])(u8 ucValue)=
{
    fun0,
    fun1,
    fun2
};

 同样如果要调用该函数指针 必须放到函数中执行

 下面也是几个例子

void Num1_1(void){JumpMenu(30,1);WriteLcd();};
void Num1_2(void){JumpMenu(50,1);WriteLcd();};
void Num1_3(void){JumpMenu(60,1);WriteLcd();};

typedef void (*F_NumOperate)(unsigned char Value);
F_NumOperate f_numA;

typedef void (*F_FunA)(void);
F_FunA Fun_1[8]={Num1_1,Num1_2,Num1_3};
//测试赋值
void KKK (void)
{
Fun_1[0]=Num1_1;
}
typedef void F_FunB(void);
F_FunB  * Fun_2[8];
//Fun_2[0]=Num1_2;
// =
// {
// Num1_1,
// Num1_2,
// Num1_3
// };
#if 0
F_FunB  * pFun_ShortKey  [4]=  
{
OperateMain1_LastsPage,
OperateMain1_Sepical,
OperateMain1_MenuPage,
OperateMain1_NextPage
};
#endif
// F_FunB  * pFun_DirectKey [4]=  {};
// F_FunB  * pFun_NumKey  [10]=  {};
//static void F_Num(void) * _apfTest[] ;
//变形3
// typedef void (*F_FunA)(unsigned char Index);
// F_FunA Fun_1[8]={Num1_1,Num1_2,Num1_3};
// //如何让 Num1_1 执行的时候 带上参数呢?

 

  typedef struct            // 事件函数表
{
 uint32_t nSendInterval;                              // 事件发送间隔
 void (* pfSendEvent)(TBMSCommControl *, uint32_t );   // 对应的事件函数
} TBMSCommSendEvent;

pfSendEvent = fun;
pfSendEvent ((TBMSCommControl *)&ggg,2)

 

 

 

文章评论1条评论)

登录后参与讨论

用户244424 2011-3-16 14:15

值得注意的是 在给函数指针数组 赋值之前 ,将要被用到的函数必须完全声明,仅声明函数原型是不行的,编译器会无法找到函数指针具体地址 比如 void fun0(u8 ucValue);不行 必须void fun0(u8 ucValue){};
相关推荐阅读
用户244424 2014-08-28 02:05
[转自21IC]旁路电容、去耦电容和消振电容答疑
在三极管放大器中,以共发射极的多级放大器为例,信号从基极输入,在基极偏置电路和集电极负载的作用下,从集电极斩输出,以上是放大器的工作过程。 为何要在发射极加旁路电容呢? 这是因为发射极电阻...
用户244424 2012-11-02 14:19
C语言 头文件 相对路径 (有局限性)
使用当对路径 假如在当前文件夹下的ABC文件夹下: #include   ".\\ABC\\head.h " 假如在当前的上一级文件夹下的ABC文件夹: #include   "..\\ABC\\...
用户244424 2012-03-21 15:14
基本知识: 宏定义的作用范围
  假如在主文件 main.c 中定义 #define _count_buf_size_ 100 #define _Mesure_buf_max_ 15   那么到其他c文件...
用户244424 2011-08-22 23:15
Win7 虚拟机 NAT方式 共享上网
开始对虚拟机NAT方式一点不了解,半天搞不对虚拟机共享上网,网上查了很多教程,明明按着做了还是不对,连接不上,以为是 Visual Network Editor 里的网关设置不对,于是越试越糊涂,最后...
用户244424 2011-08-20 01:19
各种 位数据 倒序 函数
/****************************************//* 函数名称: SwapD7_D0 */ /* 函数功能: D7-D0位置交换 *//****...
用户244424 2011-03-01 15:09
IAR 开发STM32 ARM 版本不兼容 解决办法之一
对于V4 和V5不兼容的解决方法很多了,最近用V6 版开发,结果同事用V5.3版 ,我调通之后代码给他,结果他那边显示错误,配置资料失效了,查看是版本不同导致的懒得转换,但是没办法还是得转换,只好新建...
我要评论
1
12
关闭 站长推荐上一条 /2 下一条