作业三:深入理解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

...全文
123 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文针对间歇性光伏出力条件下48V直流母线电压稳定控制及储能双向充放电闭环调控问题,提出一种基于离网光伏直流微网系统的协同控制体系。通过构建包含光伏阵列、Boost型DC-DC变换器、双向DC-DC变换器与锂离子电池储能系统的完整拓扑结构,结合光伏最大功率点跟踪(MPPT)技术和储能系统的双向功率调节能力,实现对功率供需失衡的有效抑制。系统采用分层控制架构,集成电压外环与电流内环双闭环控制策略,确保在光照强度波动、负载突变等动态工况下维持母线电压稳定。在Simulink环境中搭建全系统仿真模型,验证了控制策略在多种扰动场景下的有效性与鲁棒性,显著提升了微网在无外部电网支撑下的自主运行能力和电能质量水平。; 适合人群:具备电力电子、自动控制与新能源系统基础知识的电气工程及相关专业研究生、科研人员,以及从事光伏储能系统、直流微网设计与仿真的工程技术人员。; 使用场景及目标:①用于教学与科研中离网型光伏直流微网系统的建模与仿真分析;②指导实际工程中48V直流微网的电压稳定控制与储能协调管理方案设计;③为新能源微网中的能量管理与动态响应优化提供理论支持与仿真验证平台。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注MPPT控制算法、储能双向变换器的双闭环控制结构及其参数整定方法,深入理解系统在不同扰动工况下的响应特性与控制逻辑设计原理。

571

社区成员

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

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