首页 > 其他 > 详细

工程化编程实战callback接口学习笔记

时间:2020-03-18 23:40:30      阅读:67      评论:0      收藏:0      [点我收藏+]

任务

  1. 在VSCode下编译运行lab5-1.tar.gz 即http://pan.baidu.com/s/1pJ0qAIv
  2. 通过VSCode+GDB调试程序找出quit命令无法运行的bug产生的原因
  3. 分析callback接口的运行机制,总结callback接口设计的方法

下载并且编译

技术分享图片
技术分享图片

  • 运行quit命令出错

GDB 调试

这个调试很简单,我记录了修改代码后的GDB调试。至于找出问题所在我在下面简单的分析和描述了下。

使用GBD调试过程

  1. 启动GDB
    技术分享图片
    技术分享图片
    2.设置断点
    技术分享图片
    3.调试 (这里是调整过后的)
    此时pNode 与pLinkTable->pTail相同,结果正确。
    技术分享图片

分析问题

根据运行结果
技术分享图片
首先从main函数开始
技术分享图片
这里我们知道FindCmd() 函数返回为空
现在要继续看FindCmd函数
技术分享图片
这里我们看到FindCmd只是一个接口,真正调用的是SearchLinkTableNode()
那么我们需要继续看SearchLinkTableNode()函数

/*
 * Search a LinkTableNode from LinkTable
 * int Conditon(tLinkTableNode * pNode);
 */
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
    if(pLinkTable == NULL || Conditon == NULL)
    {
        return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != pLinkTable->pTail)
    {    
        if(Conditon(pNode) == SUCCESS)
        {
            return pNode;                   
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

这里代码逻辑很明显错误,我们从InitMenuData()初始化知道,quit命令就是放在最后一个节点,pLinkTable->pTail就是指的最后一个节点。
技术分享图片
那么此次判断条件就是没有包含最后一个节点。
技术分享图片

所以我们只需要对代码进行简单的修改,让判断条件可以覆盖最后一个节点。
技术分享图片
然后编译运行下是否符合结果。
技术分享图片

callback接口的运行机制以及设计方法

这里有个很好的回答:https://blog.csdn.net/u010885548/article/details/80047592
*** callback函数 ***
当程序跑起来时,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。
运行机制:
技术分享图片
设计:
回调接口一般由三部分组成:
中间函数和回调函数(回调的两个必要部分),以及起始函数
以本例来说明如何设计:
首先,设计起始函数
技术分享图片

回调函数:
技术分享图片
判断当前的节点里面的命令是否为输入命令

中间函数:
技术分享图片

工程化编程实战callback接口学习笔记

原文:https://www.cnblogs.com/cyssmile/p/12520518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!