作业三:深入理解Callback函数 110

cclTODO 2023-05-25 15:14:02

回调函数是一个函数,这个函数将会在另一个函数完成执行后立即执行。回调函数是一个作为参数传给另一个函数的函数,这个回调函数会在传给的函数内部执行。这一方法可以使得函数像使用普通参数一样使用其他函数。提高了函数使用的灵活性。

在计算机科学中,回调函数是指一段以参数的形式传递给其它代码的可执行代码。回调函数是一种软件设计上的概念,和编程语言没有关系,几乎所有的编程语言都能实现回调函数。回调函数又是异步下不可或缺的一种机制。

回调函数就是写一个函数,让预先写好的系统来调用。你调用系统的函数,是直调。让系统调用你的函数,就是回调。一般写程序是你调用系统的API,如果反过来,由程序员写一个函数,让系统调用程序员写的函数,那就是回调,那个直接被系统调用的函数就是回调函数(间接被调用的不算)。
例如,我们在一个网页有关的函数中调用外部API,我们肯定需要异步执行,然后传入回调函数,如果是同步执行,是阻塞的,我们需要等待调用API结果之后才能执行后面的函数,这样可能会造成界面加载卡顿、延时的情况发生,而使用回调函数异步执行,则不影响我们后面函数的执行,所以是非阻塞的。

在menu程序中,linktableInternal.h定义了LinkTable的内部数据结构。包括LinkTableNode结构体和LinkTable结构体,这两个结构体分别表示链表的节点和链表本身。这个文件主要被linktable.h和linktable.c引用,提供了链表操作所需的基本数据结构;
linktable.h这个头文件定义和声明了LinkTable操作的接口。包括创建、删除链表,以及添加、删除、搜索链表节点等功能。同时,这个文件还包含了一些宏定义,例如SUCCESS和FAILURE,用于表示操作结果;
linktable.c实现了linktable.h中定义的链表操作接口。包括创建链表、删除链表、添加节点、删除节点、搜索节点等功能。这个文件中的函数实现了回调函数机制。例如,SearchLinkTableNode函数通过传入一个回调函数Condition来对链表进行搜索,实现了搜索功能的解耦;
menu.c包含了一个简单的命令行菜单程序,它使用了linktable.h提供的链表接口。在这个程序中,命令及其对应的描述和处理函数被存储在一个链表中。程序通过查找链表来处理用户输入的命令。这个程序中的FindCmd函数使用了之前提到的SearchLinkTableNode函数,展示了如何利用回调函数进行搜索。

tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Condition(tLinkTableNode * pNode, void * args),void * args)
{
    if(pLinkTable == NULL || Condition == NULL)
    {
        return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != NULL)
    {    
        if(Condition(pNode, args) == SUCCESS)
        {
            return pNode;                    
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

 

int Condition(tLinkTableNode * pLinkTableNode, void * args)
{
    char * cmd = (char*) args;
    tDataNode * pNode = (tDataNode *)pLinkTableNode;
    if(strcmp(pNode->cmd, cmd) == 0)
    {
        return  SUCCESS;  
    }
    return FAILURE;           
}

/*函数SearchLinkTableNode( *pLinkTable, Conditon,  args),即使用了Condition函数作为SearchLinkTableNode函数的参数,其中传入的Condition函数允许用户自己设计,通过在SearchLinkTableNode函数中调用传入的Condition函数,并传入参数,实现了用户自定义查询条件。

find a cmd in the linklist and return the datanode pointer */
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
    return  (tDataNode*)SearchLinkTableNode(head, Condition, (void*)cmd);
}

/*在FindCmd函数中,将Condition函数作为参数传入SearchLinkTableNode,并传入cmd参数,最后在SearchLinkTableNode函数中将参数head->phead和cmd传入Condition函数,并调用。*/

尾号:110

...全文
130 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码链接: https://pan.quark.cn/s/a4b39357ea24 银行信贷业务作为银行业务的关键构成部分,涵盖了银行向客户提供的各类融资服务,例如贷款、担保以及信用证等。此类业务致力于协助企业与个人解决资金需求问题,进而推动经济活动的开展。银行通过信贷业务获取利息收入,同时需承担相应风险,以保障资金的稳定与流转。 **信贷定义** 信贷意味着银行运用自身资本及信誉为客户提供资金支持,而客户则需以支付利息、费用并偿还本金为前提条件。这种业务模式不仅包含直接贷款,还包括为客户的债务承担提供担保。依照会计准则,信贷业务可分为表内业务与表外业务,前者对银行的资产负债表产生直接影响,后者则不直接关联。 **信贷业务划分标准** 1. **依据会计核算归属**:表内信贷(如贷款、贴现)和表外信贷(如承兑、保证)。 2. **根据期限划分**:短期(不超过1年)、中期(1至5年)与长期(超过5年)。 3. **按照担保方式分类**:信用信贷(无担保)和担保信贷(保证、抵押、质押)。 4. **按照币种区分**:本币信贷与外币信贷。 5. **按照性质和用途区分**:固定资产贷款、流动资金贷款、循环额度贷款、消费贷款等。 6. **按照贷款组织形式区分**:普通贷款、联合贷款和银团贷款。 7. **按照资金来源区分**:信贷资金贷款、委托贷款和境外筹资转贷款。 8. **按照授信对象区分**:公司类信贷与个人类信贷。 **信贷业务产品** 1. **流动资金贷款**:用于企业日常运营周转或临时性资金需求。 2. **固定资产贷款**:用于投资固定资产项目。 3. **房地产开发贷款**:用于土地开发及房屋建设所需资金。 4. **循环额度贷款**:满足企业...

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧