本次实验任务:
-
在VSCode下编译运行lab5-1.tar.gz 即http://pan.baidu.com/s/1pJ0qAIv
-
通过VSCode+GDB调试程序找出quit命令无法运行的bug产生的原因
- 分析callback接口的运行机制,总结callback接口设计的方法
实验环境:
- Windows10+VS code+MinGW64
实验步骤
一、在VSCode下编译运行lab5-1.tar.gz
先在Windows下面安装MINGW,然后打开VScode,安装c++调试器
先用了群里的文件,结果报错,发现没有gdb,于是重新从官网安装
二.编译运行程序
打开VSCode配置运行脚本如图,按F5编译运行。
出错,添加头文件string.h
程序运行后,输入“help”,可以看到打印出的合法的输入命令,输入“version”输出正常,输入“quit”却显示命令不合法。
三.分析程序
使用gdb设置断点,分析为何quit出错
再用MIngw下载windows上可用的gdb,安装成功进行调试
quit调用FIndCmd,而FindCmd又调用SearchLinkTableNode
从程序逻辑得知当while循环判断存在异常,当pNode=pLinkTable->tail时,程序直接return NULL;
因此解释为什么输入quit的时候会报错,而前两个则不报错
改后得到
callback方法首先调用的是linktable.c中的函数,将自定义的函数SearchCondition的指针通过参数传递的方式提供给中间函数SearchLinkTableNode,而“one by one”则是在一个自定义Search函数体中调用linktable.c中的函数。
callback方法特点是将回调函数以参数的形式将函数指针传递给另一个中间函数,可以提高代码重用度,提高编程的灵活性以及编程效率。
四.callback总结
1.回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。一般情况下,应用程序会时常通过API调用库里预先准备好的函数,有些库函数需要应用先传递给它一个函数,好在合适的时候来调用。这个被传入的、又被调用的函数就是回调函数。这里必须清楚一点:函数b是你以参数形式传给函数a的,那么函数b就叫回调函数。
2.回调函数的优点:
(1)使得程序设计更加灵活。
(2)当我们想通过一个统一接口实现不同内容的时候,用回调函数来实现就非常合适。
(3)任何时候,如果你所编写的函数必须能够在不同的时刻执行不同的类型的工作或者执行只能由函数调用者定义的工作,你都可以用回调函数来实现。
(4)使用此函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法