要不是所长提示采用回调函数,可能俺还不知道怎样写一个回调函数。学了七、八年,根本没机会用,仍是一头雾水。也许一生都是“蒙古大夫”。
问题是由 ayb_ice 提出来的:
“比如程序操作一IO位,然后程序做成库,在加库的情况可以改为任意位寻址空间……”
(能够提出问题的人,一定比能够解决问题的人更具好奇心。我竟然不知道有这样的问题,真惭愧了。)
库函数是OBJ文件,可重定位连接,不能被重新编译。这样当库函数中的某个常量需要修改时,就必须重新作库文件,或者另外编写一个新的库文件以适应变化的常量。
能不能作一个通用的库函数以适应这类变化?“回调函数”(callback function)使用以下技巧。“如果你编写的函数必须能够在不同时刻执行不同类型的工作,或者执行只能由函数调用者定义的工作,你都可以使用这种技巧。” 技巧主要是使一个库(回调)函数具有一个函数指针参数,调用者使用该库函数时,把不同类型的任务通过函数指针传递给该库函数,使库函数执行不同类型的工作。而所有变化的常量,可以通过库外模块修改、并重新编译。 以 ayb_ice 的测试程序为例: ******************************************************************** 这是主函数
#include <REG52.h>
sbit LED = P1^4; //这里可由用户任意修改。
char sfrp(void); void test(char (* )(void));
void main(void) {
while(1) test(sfrp ); //主调函数
}
char sfrp(void) // 不同类型的任务 {
LED=!LED; // 函数调用者定义的工作 if(LED)return 1; else return 0; }
***************************************************** 这是库文件。适应类型及任务变化的回调函数。
#include <reg51.h> #include<stdio.h>
void test(char (*fp)(void)) {
if(fp()) printf ("* "); //模拟测试观察 else printf ("# ");
}
|