我有一段代码,我想了解它是如何工作的。 SGENT_1_calc 是一个信号生成器函数,在其他地方编写为汇编代码。当在 C 中调用计算时,sgen.calc(&sgen) 需要其自己的结构地址作为参数。为什么 ? 提前感谢您的帮助!
typedef struct {
unsigned int freq;
unsigned int step_max;
unsigned int alpha;
int gain;
int offset;
int out;
void (*calc)(void *);
}SGENT_1;
#define SGENT_1_DEFAULTS { 5369,
1000,
0,
0x7fff,
0,
0,
(void (*)(void *))SGENT_1_calc} // pointer casted here ???
void SGENT_1_calc(void *); //SGENT1_calc is a signal generator function
SGENT_1 sgen = SGENT_1_DEFAULTS; // this is an instance
sgen.calc(&sgen); //don't understand how the calculation is invoked,
// why it has &sgen as an argument ???
最佳答案
sgen.calc
是一个指向接受一个 void *
类型参数的函数的指针并且什么也不返回。所指向函数的机器代码是如何产生的并不重要。无论如何,sgen.calc
的值不包含有关存储该值的变量的信息,因此如果 sgen
包含要提交给函数的数据,那么事实上它的calc
指向该函数的成员没有提供任何方法来传递(指向)struct
.
没有关于 sgen.calc
指向的函数的其他信息,指向 sgen
的指针与任何其他对象指针一样,它也是一个很好的论据。选择该特定论点而不是其他任何论点本质上没有什么特别之处。
SGENT_1
与该布局一致。从所提供的代码中无法确定该函数是否使用 calc
成员struct
,但它作为最后一个成员的位置与不这样做是一致的。在这种情况下,它可能包含在 C struct
中。只是为了组织目的。
关于c - 当函数用汇编代码编写时,通过结构体中定义的指针调用 C 中的函数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592520/