坐标变换所需要的变量和坐标变换所需要的函数是强耦合的,在C语言中,为了模块化,和使用面向对象的思想。用结构体和函数指针来模拟类似C++的类和对象。
C语言的结构体中,不能有函数,但是可以有函数指针啊,他仍旧是个变量。不过可以用来调用函数,这样就让结构体也能调用函数了,多么像类和对象啊。
坐标变换有四个函数,正着变有两个,反着变有两个,在此以Clarke坐标变换为例。
首先坐标变换肯定属于软件工程文件里面的基本算法模块,那么模块化,就要定义个头文件和对应源文件装算法需要的所有数据和算数逻辑运算,定义algorithm.h,algorithm.c
在头文件中algorithm.h定义下面的结构体
typedef struct{
float32 a,b,c;
float32 alpha,beta;
float32 d,q;
float32 theta;
float32 sin_sita,cos_sita;
void (*Clarke)();
}TRANSFER;
上面要特别注意的是函数指针 void (*Clarke)();的定义,注意这个Clarke是个指针,虽然是函数指针,他仍旧属于指针的范畴,他的本质是个变量。关于函数函数指针的定义、初始化和调用,请参考:
在源文件algorithm.c中定义TRANSFER 类型的变量,并且初始化,
定义void clarke(TRANSFER *var)函数
上面的变量和函数要在对应头文件中做外部声明,因为他们会在其他的模块中被使用。
TRANSFER sClarkePark = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(void (*)(Uint32))clarke}
// Clarke
void clarke(TRANSFER *var)
{
var->alpha = COE_2DIVID3*(var->a - 0.5*var->b - 0.5*var->c);
var->beta = COE_2DIVID3*(HALF_SQRT_3*var->b - HALF_SQRT_3*var->c);
}
源文件中函数指针的初始化,有两种思路,一种是直接将函数名赋值给函数指针:
TRANSFER sClarkePark = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
clarke}
因为函数名本来就是该函数的首地址,这个地址是个函数的地址,自然能付给函数指针变量
一种是是将函数名进行强制类型转换:
TRANSFER sClarkePark = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(void (*)(Uint32))clarke}
这点参考:https://blog.csdn.net/qq_34888036/article/details/79684763