ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-03-19 21:53:36  阅读:245  来源: 互联网

标签:quit gcc 函数 命令 vscode 编程 链表 callback 工程化


环境

  • 系统:Win10 + ubuntu子系统
  • 版本:16.04
  • gcc版本:7.4.0
  • vscode:1.41.1

任务

  • 编译运行lab5-1
  • 通过VS Code + GDB调试程序找出quit命令无法运行的bug产生的原因
  • 分析Callback接口的运行机制,总结Callback接口设计的方法

编译项目

1.通过gcc编译


提示缺少函数声明strcmp,修改menu.c文件内容,加入#include<string.h>声明,再次编译结果正常

2. 运行项目


可以发现quit命令无法正常运行,接下来在WSL中启动vscode来调试。

调试

1. 启动vscode

在wsl中直接运行code即可开启vscode,如图

可以看到左下角显示WSL:Ubuntu,此时vscode已连接到wsl环境中。

2. 生成task.json与lauch.json文件

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "gcc build active file",
            "command": "/usr/bin/gcc",
            "args": [
                "-g",
                "${fileDirname}/linktable.c",
                "${fileDirname}/menu.c",
                "-o",
                "${fileDirname}/link"
            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "link",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

3. 调试

现在InitMenuData函数处设置断点,再单步执行观察返回结果。
在InitMenuData的函数定义来看,命令及其执行函数是保存在pNode的节点中的,追入函数AddLInkTableNode内部,可以看出每个命令都是一个链表当中的一个节点,其中pLinkTable中的pHead和pTail分别指向链表第一个元素和链表最后一个元素。

移除之前的断点,在main函数中的FindCmd处设置断点,输入“quit”后追入FindCmd函数

追踪链表查询函数


程序利用strcmp函数判断输入命令与链表中保存的命令是否相同。
继续单步执行SearchLinkTableNode的循环,执行两次循环后,pNode指向第三个节点,也就是保存“quit”命令所在的节点时,变量如下图所示

此时pNode和pLinkTable->pTail的值相等,不满足while的判断条件,会导致没有对链表的第三块元素检索就终止循环,故无法识别命令“quit”。
要使程序能够正常运行就需要修改SearchLinkTableNode函数中while的判断条件使其能够访问链表中的最后一个元素,简单地修改while循环条件即可。

重新编译,结果如下

Callback接口

在testlinktable.c可以看到代码中第51-57行分别使用callback调用搜索链表和直接用自定义函数查询链表的示例

其函数定义


callback方法首先调用的是linktable.c中的函数,将自定义的函数SearchCondition的指针通过参数传递的方式提供给中间函数SearchLinkTableNode,而“one by one”则是在一个自定义Search函数体中调用linktable.c中的函数。

callback方法特点是将回调函数以参数的形式将函数指针传递给另一个中间函数,可以提高代码重用度,提高编程的灵活性以及编程效率。

标签:quit,gcc,函数,命令,vscode,编程,链表,callback,工程化
来源: https://www.cnblogs.com/trydying/p/12527453.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有