回调函数的应用

来源:互联网 发布:淘宝二手会被骗吗? 编辑:程序博客网 时间:2024/06/05 10:35

首先什么是回调函数呢?在wiki里面的定义是:In computer programming, a callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time.什么意思呢?意思是说一个可执行的代码段(回调函数)通过参数传递给另外一段代码(调用着),而另外一段代码在恰当的时间会”回调“它。这两段代码会有一些交集,比如调用者会使用回调函数的返回值,而回调函数可能会使用到调用者的一些参数,下面会以一些例子来做说明。问题1:那么回调有什么用呢?这一设计允许底层代码使用在高层定义的子程序(这个下面会结合LWIP来说明。)问题2:在什么样的场合,我们需要考虑用回调这种设计呢。

  我们先来看问题2.看下面的一段代码:

Node*
search_list(Node* node,int const value)
{
    while(node != NULL){
        if(node->value==value)
            break;
        node = node->link;    
    }
    return node;
}

这段代码用于在一个单链表中查找一个值,它的参数是一个指向链表中的第一个节点的指针以及需要查找的那个值。但这段代码只能适用于查找的值为整型变量,这是与查找的变量类型相关的,如果我们需要查找的值是一个字符串呢?那又要重新编写一个函数来实现了。回调技术正是为了解决这种疑难杂症而存在的。那类型无关的查找,怎么用回调来实现之呢。看下面的代码:

#include<stdio.h>
#include"node.h"
Node*
search_list(Node* node,void const* value,
    int(*compare)(void const* ,void const* ,))
{
    while(node != NULL){
        if(compare(&node->value,value)==0)
            break;
    node = node->link;
    }
    return node;
}
int
compare_ints(void const* a,void const* b)
{
    if(*(int *a)==*(int *b))
        return 0;
    else
        return 1;
}
desired_node = search_list(root,&desired_value,compare_ints);

search_list是一个在单链表查找一个值的函数,这个函数的功能上面已经说过,但它的查找与类型无关因为值的比较已经交给函数compare处理,也就是说它是与类型无关的,int(*compare)(void const* ,void const* ,)  这是一个函数指针,在search_list函数参数中以函数原型的方式来进行声明。如果查找的内容是整型变量的可以这样编写compar函数。如下:

int
compare_ints(void const* a,void const* b)
{
    if((*(int*)a)==(*(int*)b))
        return 0;
    else
        return 1;
}

应用正是上面的这一行代码:desired_node = search_list(root,&desired_value,compare_ints);

当然,如果你想在字符串链表中查找的话可以像下面这样来应用:

desired_node=search_list(root,"your strings",strcmp);因为strcmp库函数和我们声明的函数是一样的。

留个问题思考,为什么search_list的value要用const来限制而node却不用呢,在声明的compare函数指针中的两个参数a和b前面的const的作用。

注意:strcmp字符串比较函数的形参是char 类型的,在这里编译的时候会有警告!关于上面的问题1,将另起一篇来讲诉。


0 0
原创粉丝点击