zoukankan      html  css  js  c++  java
  • 工程化编程实战callback接口学习笔记

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

    1.配置vscode c/c++调试编译环境,并运行lab5-1.tar.gz中的代码

    按照老师上课所给出的vscode配置环境,但是我遇到了些问题,macOS下无法debug(通过clang++),在微软vscode也给出了解释,issue #3829 ,通过下载LLDB插件可以解决。

    • 编译代码

    • 运行代码

    在执行quit命令,应该是执行退出程序,现在的结果和我们的预期不一样,所以对代码进行调试。

    2.通过vscode+GDB调试程序,寻找quit的bug

    调试前,先进行对代码的分析,大致定位代码bug的位置,那从main函数开始,main函数如下图:

    有main中可知到,程序在quit输出This is a wrong cmd!,quit指令没有通过FindCmd在存储的链表中找到。

    在进入SearchLinkTableNode

    这个函数的功能就是链表中是否有满足Condition的命令,

    这个conditon就是SearchConditon函数,完成的功能就是比对单个节点中保存的命令是否和我们要找的一致。

    还有一个函数没有看就是在main中的InitMenuData

    该函数实现链表的初始化,这里quit链表的最后一个位置。有前面的分析大致可以猜到可能是quit处于尾节点,由SearchLinkTableNode比对中没有比尾部节点,导致没有找到quit。

    分析完后进入debug环节,

    pLinkTable代表的就是链表数据结构,其中有三个节点,由InitMenuData给出,可以知道0x000...0000即使quit节点,

    pTail也是指向该节点,那么就会导致存储quit节点丢失。有debug的结果可以清晰看到pNodepTail相等了。

    修改函数SearchLinkTableNode为如下,就可以产生正确的结果了。

    测试如下,

    3.分析callback接口的运行机制,总结callback接口设计的方法

    • 计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码引用。这一设计允许了底层代码调用在高层定义的子程序。(这是维基百科定义)
    • 回调函数通常和原始调用者处于同意抽象层
    • 回调函数实现的多态的机制,通过注册不同的函数到同一个类的不同对象中,可以事项多态的机制。
    • 回调函数的实现方法
      • 在类中声明函数指针,可以对函数进行绑定
      • 类创建对象时,对对象中的函数指针进行绑定
      • 通过对象,调用绑定的函数,实现回调机制。
  • 相关阅读:
    数据处理之PostgreSQL过程语言学习
    Thinkphp中的assign() 和 display()
    JS截取与分割字符串常用技巧总结
    三种JS截取字符串方法
    十大经典排序算法的JS版
    js时间与毫秒互相转换
    javascript--清除表单缓存
    JS join()和split()方法、reverse() 方法、sort()方法
    JS数组去重的几种常见方法
    CSS样式大全
  • 原文地址:https://www.cnblogs.com/HMYaa/p/12506012.html
Copyright © 2011-2022 走看看