c - 当函数用汇编代码编写时,通过结构体中定义的指针调用 C 中的函数计算

标签 c pointers

我有一段代码,我想了解它是如何工作的。 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 的指针与任何其他对象指针一样,它也是一个很好的论据。选择该特定论点而不是其他任何论点本质上没有什么特别之处。

然而,事实上,可以合理地假设该函数假设其参数指向具有特定布局的数据结构。 C 代码暗示类型 SGENT_1与该布局一致。从所提供的代码中无法确定该函数是否使用 calc成员struct ,但它作为最后一个成员的位置与不这样做是一致的。在这种情况下,它可能包含在 C struct 中。只是为了组织目的。

关于c - 当函数用汇编代码编写时,通过结构体中定义的指针调用 C 中的函数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592520/

相关文章:

c - 从字符串中删除第一个字符会导致段错误

c - 当我用 signal(SIGINT,f) 捕捉到一个信号时,f 是并行执行的吗?

c - automake 和链接的问题

c - 为什么 C 中的数组会衰减为指针?

c++ - 将 C++ 数组指针的过去末尾转换为迭代器是否合法?

c - 双指针(struct tree_st **root)实际上是如何工作的?

c - 为什么 fork() 的返回值在 C 中有 2 个 pid 值?

c - Linux socket-他们断开了连接还是我们断开了连接?

c++ - OpenCV CvMat 到 Mat 和指针

c# - 用 C# 编写一个二进制文件以供 C 程序读取,并带有指针?