搜索
bottom↓
回复: 7

弱问一个C语言的问题:关于函数指针,在线等

[复制链接]

出0入0汤圆

发表于 2009-11-20 11:28:44 | 显示全部楼层 |阅读模式
结构体定义:
typedef struct {  _iq  As;                  // Input: phase-a stator variable
                                  _iq  Bs;                        // Input: phase-b stator variable
                                  _iq  Alpha;                // Output: stationary d-axis stator variable
                                  _iq  Beta;                // Output: stationary q-axis stator variable
                                    void  (*calc)();        // Pointer to calculation function
                                 } CLARKE;                   

typedef CLARKE *CLARKE_handle;
/*-----------------------------------------------------------------------------
Default initalizer for the CLARKE object.
-----------------------------------------------------------------------------*/                     
#define CLARKE_DEFAULTS { 0, \
                          0, \
                          0, \
                          0, \
                                        (void (*)(Uint32))clarke_calc }

/*------------------------------------------------------------------------------
Prototypes for the functions in CLARKE.C
------------------------------------------------------------------------------*/
void clarke_calc(CLARKE_handle);

=======================================================
函数定义:

void clarke_calc(CLARKE *v)
{       

   v->Alpha = v->As;

   v->Beta = _IQmpy((v->As + _IQmpy(_IQ(2),v->Bs)),_IQ(0.57735026918963)); // 1/sqrt(3) = 0.57735026918963

}

这里初始化赋值里面的(void (*)(Uint32))clarke_calc 里的(Uint32)有什么用?怎么确定的?我直接用(void (*))clarke_calc 行不行?为什么?谢谢

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-11-20 11:45:19 | 显示全部楼层
还有一点不明白,clarke_calc是一个已经定义了的函数名呀,函数名本身不就是代表地址吗?为什么还要这么多强制类型转换?

出0入0汤圆

发表于 2009-11-20 12:39:13 | 显示全部楼层
将clarke_calc强制类型转换成(void (*)(Uint32)),这个 (void (*)(Uint32)) 表示的是一个返回void类型的\参数为一个Uint32 类型数据的 函数的指针.

出0入0汤圆

 楼主| 发表于 2009-11-20 14:11:16 | 显示全部楼层
“参数为一个Uint32类型数据的”

原来如此。。。。。
3x very much

出0入0汤圆

 楼主| 发表于 2009-11-20 15:19:12 | 显示全部楼层
不是那么回事嘛,看这个:


typedef struct {         int16 Txdata[8];
                                        void (*init)();
                                        void (*dsend)();
                                }SCI;       

typedef SCI        *SCI_handle;

#define SCI_DEFAULTS {{0,0,0,0,0,0,0,0},        \
                                          (void(*)(Uint32))scia_init,\
                                          (void(*)(Uint32))scia_send \
                                         }

void scia_init(void);
void scia_send(SCI_handle);

出0入0汤圆

发表于 2009-11-20 16:48:34 | 显示全部楼层
(void (*)(Uint32))clarke_calc
这里是将clarke_calc强制转换成一个(void (*)(Uint32))类型的函数指针,它指向的函数以Uint32为参数,void为返回类型

出0入0汤圆

发表于 2010-2-3 10:31:09 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-9-27 12:02:23 | 显示全部楼层
Uint32似乎应该是指指针数据的位宽吧?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 07:17

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

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