自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(301)
  • 收藏
  • 关注

转载 链接选项

#/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o -o main /usr/local/lib/libboost_filesystem.a -L./ -Wl,-Bstatic -lTest3 -Wl,-Bdynamic # -L 指定链接库的搜索路径 我们这里加了-L./ 说明搜索库的时候也要看一看当前路径有没有所要...

2019-06-19 16:57:00 338

转载 嵌入式C语言编译器

GCC与gcc:初识编译器:扩展问题:如何理解“多语言混合开发”?参考:  狄泰软件学院唐佐林视频教程转载于:https://www.cnblogs....

2018-10-22 22:08:00 224

转载 开发中的辅助工具

开发环境:工具集:这些工具集是为了配合GCC编译器进行高效开发而设计的。实验:test.c:func.c:g_pointer默认为空指针。使用addr2line定位错误:开启core dump选项就是为了记录程序崩溃的最后一刻程序的状态和寄存器的状态。成功定位到了出错的...

2018-10-21 22:24:00 194

转载 揭开连接器的面纱(下)

本节进行一个综合实验:write函数也属于libc库,write不是系统调用,只是系统调用的一个封装。打印函数直接使用sys_write这个系统调用。系统调用编号为4。退出函数直接使用sys_exit这个系统调用。系统调用编号为1。链接脚本:代码段的起始地址在0x08048000的基础上加上一个文件头的...

2018-10-21 21:36:00 144

转载 揭开链接器的面纱(中)

思考:链接器根据什么原则完成具体的链接工作?入口函数是可配置的?那么其他的原则是不是也可以配置呢?假设是可以配置的,那么必然的存在一个配置文件,在这个文件中可以配置各种各样的原则。这个配置文件就是链接脚本。链接脚本里面就写了链接原则(如何链接各个段,如何重定位)。上图指定了代码段的起始地址为0x20000000。这就是重定位。...

2018-10-21 20:21:00 119

转载 揭开连接器的面纱(上)

链接器在合并各个目标文件中的段时需要将标识符的最终地址给确定了。这就是重定位的过程(确定各个段的最终起始地址以及各个标识符的地址)。示例:test.c如下:func.c如下:编译func.c,并查看符号信息:可以看到func这个标识符相对于代码段的偏移位置为0。g_pointer前面有一个...

2018-10-21 19:07:00 98

转载 深入理解程序的结构

程序的构成:从操作系统的角度来看文件头记录了与可执行文件相关的一些基本信息。静态分析工具大多根据程序的文件头获得相关信息。初始化的变量进入.data段,没有初始化的全局变量进入.bss段。未初始化的变量默认为0,为了存储效率和加载效率。没有初始化的默认为0,在程序文件中就不用存储初始值了,只需在程...

2018-10-20 22:42:00 124

转载 调试利器GDB(下)

本节我们研究gdb更深层的用法:数据断点:可以根据变量的值来监视变量。数据断点本质是硬件断点,数量有限。watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变了,程序运行就停止。数据断点常常配合gdb里面的内存查看命令使用。x是检查内存数据的命令。上图中的意思是打印从0x804a024地址开始连续4个字节的数据,...

2018-10-20 13:23:00 101

转载 调试利器GDB(上)

什么是GDB:GDB应用:静态分析工具与动态分析工具:GDB启动方式:GDB启动之后会有一个交互式的命令行,可以输入GDB特定的命令让GDB去工作。gdb test.out意思是这一次gdb启动关注的是test.out这个进程。gdb test.out core意思是程序崩溃时产生core文件。动态连接:gdb test.out pi...

2018-10-20 11:43:00 98

转载 第十九课 特权级转移(中)

处理器通过什么规则判断资源请求或者代码跳转是否合法?数据段的访问规则:(数据段无可执行属性)  访问者权限(CPL)高于或者等于数据段权限(DPL)  请求特权级(RPL)高于或者等于数据段权限(DPL)  即(CPL <= DPL)&& (RPL <= DPL)上面的公式没有阐述CPL和RPL的关系,这是因为对数据段进行访问的时候CPL和...

2018-10-13 15:22:00 98

转载 第十八课 特权级转移(上)

这一节我们来研究从核心代码特权级转移到应用代码特权级。首先将boot.asm贴出来如下: 1 org 0x7c00 2 3 jmp short start 4 nop 5 6 define: 7 BaseOfStack equ 0x7c00 8 BaseOfLoader equ 0x9000...

2018-10-13 12:03:00 269

转载 部分匹配值递推求解原理

转载于:https://www.cnblogs.com/wanmeishenghuo/p/9735321.html

2018-10-01 18:41:00 136

转载 第二十四课 第三方库的使用支持

如果我们正在进行的项目需要使用第三方库,那么前几节的makefile能胜任吗?答案是否定的。本节我们研究第三方库的使用。使makefile支持第三方库。libs第三方库一般和其他模块是并列的关系。因此,libs文件夹和commom、module等文件夹是同等地位的。动态链接库和静态链接库都有对应的头文件。编译阶段:实际工程...

2018-10-01 18:30:00 150

转载 第二十三课 模块独立编译的支持

一般而言,不同的工程师负责不同的模块开发,写一段代码之后我们一般要先编译一下,确定一下有没有语法错误,但是,如果将整个工程完整编译一遍非常耗费时间,那么编译环境如何支持模块的独立编译呢?上图中我们执行make main则只编译main模块。模块独立编译也方便了单元测试。模块独立编译的解决方案:关键技术:第一个依赖是build文件夹,第二个依赖...

2018-10-01 18:21:00 110

转载 第二十二课 打造专业的编译环境(下)

这一节我们来研究一下上一节中makefile存在的问题:第一个问题导致了项目的文件夹不能移动,一旦移动则编译失败。这样可以使得工程文件夹随意移动。顶层makefile改动后的部分程序如下:第35、36行我们通过命令行变量将路径传到模块makefile中,因此,模块makefile中的这两个相应的写死的路径可以删掉了。...

2018-10-01 18:15:00 120

转载 第二十一课 打造专业的编译环境(中)

上一节我们完成了第一阶段的任务,这一节我们来完成第二阶段的任务:编译静态库的工作是调用模块的makefile完成的。实现要点:只有知道了项目中有哪些模块,才能知道对应的文件夹的名字。我们做如下的假设:项目中的模块基本稳定,模块名字直接写到makefile中去makefile中嵌入shell的for循环:set-e告诉m...

2018-10-01 18:04:00 105

转载 第二十课 打造专业的编译环境(上)

本节我们研究大型项目的编译。大型项目的结构如下:大型项目会划分不同的模块,不同的模块负责不同的功能。在模块文件夹中还有更深一层的文件夹管理,如上图中的module模块中的样子。每个模块都有一个makefile,负责当前模块的编译工作。最顶层的makefile负责整体控制。build文件夹负责存储编译结果,这样可以防止污染源代码。build文件夹中也有相应的管理...

2018-10-01 18:00:00 117

转载 第十九篇 路径搜索的综合示例

项目类型分析:这是一种扁平的代码管理方式。makefile直接放到项目文件夹下面。示例工程:源码的目录如下:最终的makefile如下: 1 .PHONY : all clean 2 3 4 DIR_BUILD := build 5 DIR_SRC := src 6 DIR_INC := inc...

2018-10-01 17:56:00 156

转载 第八十课 最长不下降序列

1 int search_max_path(Graph<int, int>& g, int v, Array<int>& count, Array<int>& path, Array<bool>& mark) 2 { 3...

2018-10-01 16:32:00 99

转载 第七十九课 最短路径(Floyd)

程序如下: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "SharedPointer.h" 6 #incl...

2018-10-01 15:30:00 132

转载 第七十八课 最短路径(Dijkstra)

核心思想是从已知的最短路径推算未知的最短路径。添加程序: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "Sh...

2018-10-01 11:24:00 116

转载 第七十七课 最小生成树(Kruskal)

添加kruskal算法: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "SharedPointer.h" 6 #include "Array.h" 7...

2018-10-01 10:37:00 79

转载 第76课 最小生成树(Prim)

图解:添加prim函数: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "SharedPointer.h"...

2018-10-01 07:45:00 81

转载 第七十五课 图的遍历(DFS)

添加DFS函数: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "SharedPointer.h" 6 #include "Array.h" 7 #include "DynamicArray.h" 8...

2018-09-27 23:11:00 93

转载 第七十四课 图的遍历(BFS)

广度优先相当于对顶点进行分层,层次遍历。在Graph.h中添加BFS函数: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #include "SharedPointe...

2018-09-27 22:44:00 64

转载 第七十三课 图的存储结构(下)

增加新顶点的时候只能在链表的末尾进行,其他的顶点的编号不能打乱了。添加ListGraph.h文件: 1 #ifndef LISTGRAPH_H 2 #define LISTGRAPH_H 3 4 #include "Graph.h" 5 #include "LinkLi...

2018-09-26 22:35:00 122

转载 第七十二课 图的存储结构(上)

顶点和数据元素相关联:每个顶点关联着一个字符串,这个就是顶点的数据,这个数据关联着工程意义。添加MatrixGraph.h文件: 1 #ifndef MATRIXGRAPH_H 2 #define MATRIXGRAPH_H 3 4 #...

2018-09-25 23:18:00 74

转载 第七十一课 图的定义与操作

后面的代码只考虑有向图,因为无向图可以看做一种特殊的有向图。添加Graph.h文件: 1 #ifndef GRAPH_H 2 #define GRAPH_H 3 4 #include "Object.h" 5 #includ...

2018-09-24 20:53:00 56

转载 第七十课 二叉树经典面试题分析

删除结点1之后,下一个删除的就是3了。程序: 1 #include <iostream> 2 #include "BTreeNode.h" 3 4 using namespace std; 5 using namespace DTLib; 6 7 template < typename ...

2018-09-24 17:37:00 69

转载 第六十九课 二叉树的线索化实现

在工程中,很多时候二叉树一旦建立就不会轻易改动,这样的二叉树就用于遍历,我们讲了先序遍历、中序遍历、后续遍历三种方式,都是递归完成的,在工程中,如果对一棵二叉树反复的执行遍历,效率很低,递归的效率是比较低的。改进的做法就是将遍历的结果保存下来,下一次遍历时直接用这个结果。在工程中另一种需求就是,在中序遍历下,需要知道某一个节点的前驱是谁,后继是谁,需要这三个节点来...

2018-09-24 14:28:00 86

转载 第六十八课 二叉树的比较与相加

克隆操作也是递归实现的。添加克隆函数: 1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #include "Exception.h" 7 #include "LinkQueue.h" ...

2018-09-24 11:24:00 140

转载 第六十七课 二叉树的典型遍历方式

在BTree.h中添加遍历函数: 1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #includ...

2018-09-24 10:19:00 90

转载 第六十六课 二叉树结构的层次遍历

GTree和BTree中都有遍历相关的函数,因此,我们将这些遍历相关的函数放到Tree.h中,作为纯虚函数声明:如下: 1 virtual bool insert(TreeNode<T>* node) = 0; 2 virtual bool insert(const T& value, ...

2018-09-24 10:06:00 82

转载 第六十五课 二叉树中属性操作的实现

递归功能函数:1 int count(BTreeNode<T>* node) const2 {3 return (node != NULL) ? (count(node->left) + count(node->right) + 1) : 0;4 }功能函数如下:...

2018-09-24 09:19:00 68

转载 第六十四课 二叉树中结点的删除与清除

BTree.h中添加删除操作: 1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #include "Exception.h" 7 #include "LinkQueue.h"...

2018-09-24 08:29:00 357

转载 第六十三课 二叉树中的结点插入操作

如果新节点指定的目标父节点已经有左孩子和右孩子了,这时插入就会失败,这就是和通用树不同的地方。插入新结点时,需要指定插入位置。例如,左孩子或者右孩子位置。不带位置参数的插入函数可以插入到任何位置。BTreeNode实现了自己的工厂模式,如下所示: 1 #ifndef BTREENODE_H 2...

2018-09-23 19:42:00 440

转载 第六十二课 二叉树中的结点查找操作

先查找根节点元素值是不是9,不是的话就查找两个子树,这就是递归的过程。返回第一个找到的结点。添加查找函数: 1 #ifndef BTREE_H 2 #define BTREE_H 3 4 #include "Tree.h" 5 #include "BTreeNode.h" 6 #...

2018-09-23 18:55:00 388

转载 第六十一课 二叉树的存储结构设计

BTree和BTreeNode之间是聚合关系,BTree需要聚合的使用BTreeNode。BTreeNode要包含指向父节点的指针,方便工程应用。二叉树也是容器类型,需要实现增删查。先重构GTreeNode.h和TreeNode.h文件: 1 #ifndef GTREENODE_H 2 #define GTREE...

2018-09-23 18:12:00 145

转载 第六十课 二叉树的深层特性

证明:两种求e的方法分别是从上往下看和从下往上看。转载于:https://www.cnblogs.com/wanmeishenghuo/p/9692698.html

2018-09-23 14:50:00 54

转载 第五十九课 树到二叉树的转换

简化之后树节点中孩子的数量就少了,但是通用树形结构中每个节点可能有很多个孩子,这样简化之后的树还能描述通用的树形结构吗?每个节点都有一个指向其第一个孩子的指针,每个节点都有一个指向其第一个右兄弟的指针。任何的树形结构都能用“二杈”的方式表示,也就是用孩子兄弟表示法。因此,我们的研究内容可以局限到树的节点中只有两个指针的特殊的树形...

2018-09-23 14:17:00 79

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除