C 编码设计 - 函数指针?

电器工程 微控制器 图片 C 代码设计
2022-01-12 19:45:42

我有一个PIC18F46K22并使用 XC8 编译器对其进行编程。最后,我将拥有一个类似于 pc 的系统,stdin并且stdout. 所以在主循环中会有一个函数检查是否有新的输入。如果有输入,则会相应地调用一个函数。因此,例如,当我输入 A on 时stdin,PIC 将运行一个函数,function_A而不是function_B在我输入 B 时调用该函数。

当 PIC 完成函数后,我希望将新输入发送到函数。因此,当按下 A 打开 RS232 发射器时,从那一刻起,每个输入都将通过 RS232 发送。最后,该项目是一个独立的文本编辑器。因此,当按 A 打开文件系统时,从那一刻起,您不再是文本编辑,而是查看文件列表。这意味着按下 Up 和 Down 意味着与文本编辑环境中的不同。

我已经做了很多关于如何在 C 中编程的思考。我昨晚想到了这个,想知道它是否可能,如果可能,如何。我想做的是:

  • main函数调用一个函数,如function_A
  • function_A将全局变量更改function_addr为函数的地址指针in_function_A
  • 从那一刻起,在有新输入时main调用该函数。function_addr

所以我需要一个main检查是否function_addr为零的函数。如果是,则应调用“正常”函数,例如function_A. 如果不是,则function_addr应该调用 at 的函数。我还需要一个function_A将 更改function_addr为指向 的指针in_function_A

注意:当文件系统函数应该关闭时,is_function_A应该只更改function_addr为 0。

所以基本上我的问题是我怎么能

  • 获取函数的地址(并将其存储在变量中)
  • 在指定地址调用函数
2个回答

一个函数

int f(int x){ .. }

获取函数的地址(并将其存储在变量中)

int (*fp)(int) = f;

在指定地址调用函数

int x = (*fp)( 12 );

虽然Wouters 的回答绝对正确,但这可能对初学者更友好,并且是关于您的问题的更好示例。

int (*fp)(int) = NULL;

int FunctionA(int x){ 
    return x + x;
}

int FunctionB(int x){ 
    return x * x;
}

void Example(void) {
    int x = 0;

    fp = FunctionA;
    x = fp(3);  /* after this, x == 6 */

    fp = FunctionB;
    x = fp(3);  /* after this, x == 9 */
}

如果函数指针实际上分配了目标函数地址并不明显,则执行 NULL 检查是明智的。

if (fp != NULL)
    fp(); /* with parameters, if applicable */