打印

感谢所长,和ayb_ice 。

[复制链接]
2686|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wxj1952|  楼主 | 2008-5-26 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要不是所长提示采用回调函数,可能俺还不知道怎样写一个回调函数。学了七、八年,根本没机会用,仍是一头雾水。也许一生都是“蒙古大夫”。

问题是由 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 ("#   "); 

}

相关帖子

沙发
dld2| | 2008-5-26 09:38 | 只看该作者

顶一下

回调函数是个好东西。

使用特权

评论回复
板凳
ayb_ice| | 2008-5-26 15:02 | 只看该作者

我可以搞定了

不过要用混合编程,其实意义也不大,把单个模块写好一点,考虑全点,直接宏配置一下是一样的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

757

帖子

1

粉丝