打印

函数指针定义在结构体中,如何调用函数

[复制链接]
2109|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhoumeng4077|  楼主 | 2014-2-20 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在头文件中,函数指针定义在一个AD模块结构体中
//-----------------------------------------------------------------------------
typedef struct {      
                            float VC1;                     //VC1
                float Volt_channelA0;    //Output:DSP A通道8个管脚上的电压值
                void (*read)();       // Pointer to the read function
               }ADC_VOLT_CURRENT_GET;   //ADC模块结构体
//-----------------------------------------------------------------------------
// Define a POSSPEED_handle
//-----------------------------------------------------------------------------

typedef ADC_VOLT_CURRENT_GET  *ADC_VOLT_CURRENT_GET_handle;

//-----------------------------------------------------------------------------
// Default initializer for the POSSPEED Object.
//-----------------------------------------------------------------------------
#define ADC_VOLT_CURRENT_GET_DEFAULTS {0,0,\
                                                                (void (*)(long))ADC_volt_current_get_Calc}

//-----------------------------------------------------------------------------
//  函数声明                             
//-----------------------------------------------------------------------------
Void  ADC_volt_current_get_Calc (ADC_VOLT_CURRENT_GET_handle);
  
在源文件中,调用ADC采样计算函数的方式如下
//采样电压电流
Volt_current.read(&Volt_current);   //主要是这里看不懂
  

我对这种调用方式看不太懂,不太明白。有两个问题想请教一下大家:
望不吝赐教!非常感谢!

第一: 调用函数时,函数名为什么是Volt_current.read ?
写成 ADC_volt_current_get_Calc 不可以吗?
   也就是用这种写法来调用函数 ADC_volt_current_get_Calc(&Volt_current) ,这样可以吗?作者那样做的目的是什么呢?

第二:函数声明的时候,形参是个结构体指针ADC_VOLT_CURRENT_GET_handle
//-----------------------------------------------------------------------------
//  函数声明                             
//-----------------------------------------------------------------------------
Void  ADC_volt_current_get_Calc (ADC_VOLT_CURRENT_GET_handle);
  
但是调用的时候函数实参是个地址(&Volt_current)
//采样电压电流
Volt_current.read(&Volt_current);  
为什么这样做是等价的呢?
期待各路大神为初学者解答一下,谢谢

相关帖子

沙发
zhoumeng4077|  楼主 | 2014-2-20 13:50 | 只看该作者
//以下结构体变量的定义与用户在相应头文件里的定义有关,
ADC_VOLT_CURRENT_GET  Volt_current = ADC_VOLT_CURRENT_GET_DEFAULTS;  //AD采样模块对应的结构体变量

使用特权

评论回复
板凳
zhoumeng4077|  楼主 | 2014-2-20 14:17 | 只看该作者
函数定义如下


void ADC_volt_current_get_Calc(ADC_VOLT_CURRENT_GET *p)
{
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1);

p->Volt_channelA0= 3.0 * (AdcRegs.ADCRESULT0>>4)/4095.0;

p->Ia = (333.333/Rm_Ia)*(-5.0*p->Volt_channelA0/3.0 + 2.5);   //333.333=1000/3为电流传感器的原边与副边匝比
}

使用特权

评论回复
地板
sywh| | 2014-2-20 15:16 | 只看该作者
ADC_VOLT_CURRENT_GET  Volt_current = {0,0,                                                          (void (*)(long))ADC_volt_current_get_Calc}


这里将该指针指向了ADC_volt_current_get_Calc这个函数

大概就是,你创建了一个对象,然后将该对象的成员函数指针指向了计算函数,

使用特权

评论回复
5
lysjjstone| | 2015-10-19 22:40 | 只看该作者
(void (*)(long))ADC_volt_current_get_Calc}

这里的 long 是什么意思?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝