typedef struct
{
void (*calc)(void *); // Pointer to calculation function
int32 ref; // PID给定,Q15
int32 fdb; // PID反馈,Q15
} PID_FUNC;
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //
#define PID_FUNC_DEFAULTS \
{ \
(void (*)(void *))PidFuncCalc \
}
void PidFuncCalc(PID_FUNC *p)
{
}
pidFunc.calc(&pidFunc); // PID计算
pidREF = pidFunc.ref;
上面是结构体的定义和最后两句是用法,我不太懂的是
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //是什么意思啊?函数指针能够等于结构体变量吗?不同的类型能这样吗?但事实上编译通过的,为什么?请指教。
Young Hu:
这种写法没有问题,pidFunc是结构体,可以赋值,将函数地址赋值到内部的函数指针。
typedef struct
{
void (*calc)(void *); // Pointer to calculation function
int32 ref; // PID给定,Q15
int32 fdb; // PID反馈,Q15
} PID_FUNC;
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //
#define PID_FUNC_DEFAULTS \
{ \
(void (*)(void *))PidFuncCalc \
}
void PidFuncCalc(PID_FUNC *p)
{
}
pidFunc.calc(&pidFunc); // PID计算
pidREF = pidFunc.ref;
上面是结构体的定义和最后两句是用法,我不太懂的是
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //是什么意思啊?函数指针能够等于结构体变量吗?不同的类型能这样吗?但事实上编译通过的,为什么?请指教。
haosen ou:
回复 Young Hu:
这个PID_FUNC_DEFAULTS不是表示函数指针吗?如果结构体里面有两个函数那还能这样赋值吗?或者结构体里面函数的位置不是在第一个位置,还能这样赋值吗?把函数指针赋值给结构体变量,是把函数的首地址赋值给结构体的第一个成员吗?
typedef struct
{
void (*calc)(void *); // Pointer to calculation function
int32 ref; // PID给定,Q15
int32 fdb; // PID反馈,Q15
} PID_FUNC;
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //
#define PID_FUNC_DEFAULTS \
{ \
(void (*)(void *))PidFuncCalc \
}
void PidFuncCalc(PID_FUNC *p)
{
}
pidFunc.calc(&pidFunc); // PID计算
pidREF = pidFunc.ref;
上面是结构体的定义和最后两句是用法,我不太懂的是
PID_FUNC pidFunc = PID_FUNC_DEFAULTS; //是什么意思啊?函数指针能够等于结构体变量吗?不同的类型能这样吗?但事实上编译通过的,为什么?请指教。
HY Dee:
回复 haosen ou:
这里仅仅是一个巧合,你将结构体中的内容换下顺序试试.
测试代码如下:
#include <stdio.h>typedef struct {int a;int b;void(*calc)(void *);
}TEST;void FuncCalc(TEST *p)
{p->a = 10;p->b = 20;
}#define TESTFUNC\
{\(void (*)(void *))FuncCalc\
}TEST test = TESTFUNC;int main(){test.calc(&test);printf("%d %d\n",test.a,test.b);return 0;
}
TI中文支持网



