- 博客(219)
- 收藏
- 关注
原创 用队列实现栈
问题:能否用队列实现栈?问题分析:本质为,用队列先进先出的特性实现栈后进先出的特性。QueueToStack.h#include <iostream>#include "linkstack.h"#include "LinkQueue.h"using namespace std;using namespace DTLib;template <type...
2020-07-06 22:41:00
67
原创 用栈实现队列
问题:栈和队列在实现上是非常类似的,是否可以用栈实现队列?问题分析:用栈实现队列等价于用后进先出的特性实现先进先出的特性。准备两个栈,一个栈用于元素进来,另一个栈用于元素的出去。即从一个栈A中取出数据元素,先放入另一个栈B中,待将栈中A中的数据元素全部放入B中,再从栈B中取出数据元素,经过这么一折腾,这不就由后进先出变成了先进先出嘛。当stack_out里面没有数据元素的时候,才进...
2020-07-06 21:57:00
73
原创 strace命令
1.strace简介strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。2.编译、安装strace首先需要以下两个文件:strace-...
2020-03-29 15:39:00
241
原创 普通U盘及多分区U盘的自动挂载【转】
原文:https://www.cnblogs.com/lifexy/p/10107310.html上篇博客只是讲解了普通U盘挂载,并没有涉及到多分区U盘,接下来本章来继续学习1.多分区U盘和普通U盘区别1)U盘插上只会创建一个/dev/sda文件,这种一般表示该U盘没有分区,这个sda文件便代表该U盘总大小,我们只需要挂载/dev/sda即可2)另一种U盘则会创建/dev/sda...
2020-03-29 14:32:00
116
原创 修改mdev的配置以支持U盘的自动挂载
原文:https://www.cnblogs.com/lifexy/p/7891883.html1.当我们每次插入u盘后,都会自动创键U盘的设备节点/dev/sda%d这是因为里面调用了device_create()实现的, busybox的mdev机制就会根据主次设备号等信息,在/dev下创建设备节点,如下图所示:/dev/sda:表示整个U盘/dev/sda1:表示U盘的第一个...
2020-03-28 22:33:00
254
原创 mdev详解【转】
mdev详解【转】转自:http://blog.chinaunix.net/uid-29401328-id-5019678.html一、概述mdev是busybox提供的一个工具,用在嵌入式系统中,相当于简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。在加载驱动过程中,根据驱动程序,在/...
2020-03-27 23:12:00
157
原创 GDB在ARM板中的应用
GDB的下载:http://www.gnu.org/software/gdb/下载gdb-7.4.tar.bz21.解压: tar xjf gdb-7.4.tar.bz22.编译gdb和gdbserver2.1 编译gdb: cd gdb-7.4/ .configure -- target=arm-linux //配置 make //编译 make inst...
2020-03-25 07:26:00
68
原创 函数调用栈的查看(backtrace和frame)
backtrace:查看函数的调用顺序(函数调用栈的信息)frame N (实际上是上下文跳转的命令):切换到栈编号为N的上下文中info frame:查看当前函数调用的栈帧信息。所谓栈帧就是与函数调用相关的栈上的消息什么是栈帧信息深入info命令命令 功能说明info registers 查看当前寄存器的值info args ...
2020-03-22 15:39:00
367
原创 数据断点
1.数据断点GDB支持数据断点的设置watch命令用于监视变量是否被改变(本质上为硬件断点)watch命令的用法:watch var_name2.GDB中的内存查看GDB中可以检查任意内存区域中的数据命令语法: X /Nuf expressionN—需要打印的单元数u—每个单元的大小,即打印单元的单位f—数据打印的格式示例:X / 4bx 0x804a0244表示...
2020-03-22 14:33:00
77
原创 使用GDB进行断点调试
1.断点类型软件断点:由非法指令异常实现(软件实现)硬件断点:由硬件特性实现(数量有限)数据断点:由硬件特性实现(数量有限)为什么要分软件断点和硬件断点呢?软件断点通常是可以运行于内存中的程序,代码加载到内存中执行,那么软件断点就是有效的。对于flash中的程序执行,软件断点就没有用了。此时必须依赖于硬件断点。这就是软件断点和硬件断点使用上的不同。软件断点:适用于运行于内存中的程...
2020-03-17 23:31:00
306
原创 GDB的启动方式
1.直接启动gdbgdb test.outgdb test.out core 异常崩溃时产生的core2.动态连接gdb test.out pid(进程)动态的跟踪pid进程的行为3.GDB应用示例一gdb //启动(gdb) file test.out //载入目标程序(gdb) set args arg1 arg2 //设置命令行参数(gdb) run ...
2020-03-17 23:10:00
108
原创 调试利器GDB概念
1.GDB:GNU项目中的调试器(GNU debugger)(1)能够跟踪程序的执行;(2)能够恢复程序崩溃前的状态;2.为什么需要GDB?(1)软件不是一次性开发完成的(是软件就有bug,是程序就有问题)(2)调试是开发过程中不可或缺的技术(调试技术很重要)3.GDB的常规应用—自定义程序的启动方式(指定影响程序运行的参数。命令行参数的本质就是main函数的参数)—设置条件断点...
2020-03-17 22:54:00
35
原创 小狗钱钱
书中,吉娅的父母深受债务问题的困扰。钱钱给吉娅提出了四条忠告:️1.欠债的人应当消除「坏支出」和「坏支出」产生的负债2️.如果是能“帮你赚钱”的负债要尽可能的延长偿还时间。️3.对于消费贷款,欠债的人应该将不用于生活的钱一半存起来,另一半用于还债。️4.对于所有的消费,都要问自己【这真的有必要吗?】,尽可能的减少【不必要的】开支第一条:要消除「坏支出」和「坏支出」产生的负债。很多...
2020-03-10 23:32:00
41
原创 device_node转换为platform_device
以前在写驱动程序的时候,需要把驱动分为平台device和平台driver两部分。在平台device中会放入硬件所使用的资源,使用C代码来指定platform_device,当需要修改硬件资源时,比如说想去修改led的引脚时,需要重新修改C文件,重新编译内核。再后来我们使用了设备树,可以在设备树中指定硬件资源。设备树是dts文件,它会转换成dtb文件,最终给内核使用。内核会来解析dtb文件得到一系...
2020-02-25 22:51:00
61
原创 典型问题分析4—StaticLinkList中数据元素删除时的效率问题
StaticLinkList中数据元素删除时的效率问题void destroy(Node* pn) { SNode* space = reinterpret_cast<SNode*>(m_space); SNode* psn = dynamic_cast<SNode*>(pn);//从父类指针,转换为子类指针,直接调用dynam...
2020-02-22 15:15:00
34
原创 典型问题分析3—LinkList中遍历操作与删除操作混合使用
LinkList中遍历操作与删除操作混合使用删除成功后,list.current()返回什么值?#include <iostream>#include "LinkList.h"using namespace std;using namespace DTLib;int main(){ LinkList<int> list; for(i...
2020-02-22 15:03:00
59
原创 典型问题分析2-LinkList中数据元素删除
LinkList中的数据元素删除LinkList<Test> list;Test t0(0), t1(1), t2(2);try{ list.insert(t0); list.insert(t1); //在t1析构时抛出异常 list.insert(t2); list.remove(1);}catch(...){ ...
2020-02-22 10:02:00
92
原创 对话框及其类型2
模态对话框(QDialog::exec())-显示后无法与父窗口进行交互-是一种阻塞式的对话框调用方式非模态对话框(QDialog::show())-显示后独立存在可以同时与父窗口进行交互-是一种非阻塞式的对话框调用方式一般情况下-模态对话框用于必须依赖用户选择的场合(80%) 消息提示,文件选择,打印设置,等-非模态对话框用于特殊功能设置的场合(20%) 查找操作,属性设置,等小技...
2020-02-17 10:55:00
32
原创 对话框及其类型1
对话框是与用户进行简短交互的顶层窗口QDialog是Qt中所有对话框窗口的基类QDialog继承于QWidget是一种容器类型的组件QDialog的意义-QDialog作为一种专用的交互窗口而存在-QDialog不能作为子部件嵌入到其它容器中-QDialog是定制了窗口式样的特殊的QWidgetQDialog和QWidget的区别1.QDialog的父组件为QWidget#includ...
2020-02-17 08:51:00
44
原创 Qt对象之间的父子关系
Qt对象之间可以存在父子关系-每一个对象都保存有它所有子对象的指针-每一个对象都有一个指向其父对象的指针parent是一个对象,它里面有一个子对象指针链表,里面的每个指针指向了一个子对象。这些子对象也存有指向parent的指针Qt中的对象如何指定它的父对象呢?当指定Qt对象的父对象时-其父对象会在子对象链表中加入该对象的指针-该对象会保存指向其父对象的指针QObject* p = new...
2020-02-17 08:10:00
86
原创 典型问题分析1一空指针问题
什么空指针问题呢?首先看一下调用过程:创建一个NullPointerException类的对象(1)调用父类的构造函数Exception,并且以0作为参数;(2)调用到init函数,以3个0作为参数;(3)通过调用strdup函数,将message复制一份出来,然后将复制出来的message赋值给m_message,只不过这个时候的message是空指针;好像在我们的代码中并没有出现什么bu...
2020-02-15 21:43:00
72
原创 动态内存申请的结果——专题2
实验一:证明new_handler全局函数是否存在#include <iostream>#include <new>#include <cstdlib>#include <exception>using namespace std;class Test{ int m_value;public: Test() ...
2020-02-13 09:58:00
32
原创 动态内存申请的结果——专题1
动态内存申请一定成功吗?常见的动态内存分配代码C代码:int* p = (int*)malloc(10 * sizeof(int));if( p!=NULL ){ //... ...}C++代码:int* p = new int[10];if( p!=NULL ){ //... ...}必须知道的事实malloc函数申请失败时返回NULL值new关键...
2020-02-13 09:42:00
41
原创 函数的异常规格说明
问题:如何判断一个函数是否会抛出异常,以及抛出哪些异常?假设在开发的时候,调用一个函数来完成某项任务,这个函数不是你写的或者是第3库中的一个函数,那么问题来了,你如何确定这个函数会不会抛出异常呢?为什么要搞清这个问题,因为我们学习了异常处理,那么我们在调用一个函数的时候,就必须考虑这个函数会不会抛出异常,如果会,又抛出什么异常?看一下函数实现,貌似可以。但如果这个函数是第三方库实现的,只有函数的...
2020-02-12 22:45:00
50
原创 异常处理深度解析
问题:如果在main函数中抛出异常会发生什么?#include <iostream>using namespace std;class Test{public: Test() { cout << "Test()" << endl; } ~Test() { cout &l...
2020-02-12 21:25:00
48
原创 new[]/delete[]与new/delete区别
new[]/delete[]与new/delete完全不同-动态对象数组创建通过new[] 完成-动态对象数组的销毁通过delete[]完成-new[]/delete[]能够被重载,进而改变内存管理方式new[]/delete[]的重载方式//static member functionvoid* operator new[](unsigned int size){ retur...
2020-02-11 21:02:00
37
原创 如何在指定的地址上创建C++对象
如果已经掌握在静态存储区上创建对象的方法,那么可以扩展一下,可以在任意地址上创建C++对象。解决方案:-在类中重载new/delete操作符-在new的操作符重载函数中返回指定的地址-在delete操作符重载中标记对应的地址可用自定义动态对象的存储空间第二个实验指定了空间为静态存储区中的空间,现在扩展一下不指定具体的空间是哪里,可以临时的动态做决定。#include <iostr...
2020-02-11 20:24:00
122
原创 静态存储区中创建动态对象
#include <iostream>#include <string>using namespace std;class Test{private: static const unsigned int COUNT = 4; static char c_buffer[]; //首先定义一个静态存储区 static char ...
2020-02-11 19:38:00
27
原创 new和delete关键字
new关键字创建出来的对象位于什么地方?很明显嘛,new关键字创建出来的对象一定位于堆空间,这种说法一定正确吗?本篇博客帮你揭开其神秘的面纱。被忽略的事实new/delete的本质是C++预定义的操作符C++对这两个操作符做了严格的行为定义-new:1.获取足够大的内存空间(默认为堆空间)2.在获取的空间中调用构造函数创建对象-delete:1.调用析构函数销毁对象2.归还对象所占用的空间(默...
2020-02-11 13:16:00
45
原创 统计对象中某个成员变量的访问次数
实例1:适用于非const对象#include <iostream>#include <string>using namespace std;class Test{private: int m_value; int m_count;public: Test(int value = 0) { m_value...
2020-02-11 12:59:00
29
原创 用户界面与业务逻辑的分离
界面与逻辑基本程序架构一般包含:—用户界面模块(UI) 接受用户输入及呈现数据—业务逻辑模块(Business Logic) 根据用户需求处理数据用户界面与业务逻辑如何交互?基本设计原则功能模块之间需要进行解耦核心思想:强内聚,弱耦合-每个模块应该只实现单一的功能-模块内部的子模块只为整体的单一功能而存在-模块之间通过约定好的接口进行交互QCalculatorU...
2019-12-29 11:30:00
130
原创 计算器核心算法——终结版
QCalculatorDec.h#ifndef _QCALCULATORDEC_H_#define _QCALCULATORDEC_H_#include <QString>#include <QQueue>#include <QStack>class QCalculatorDec{protected: QString...
2019-12-29 10:00:00
40
原创 计算器核心算法——中缀表达式转为后缀表达式
中缀表达式转后缀表达式的过程类似编译过程——四则运算表达式中的括号必须匹配——根据运算符优先级进行转换——转换后的表达式中没有括号——转换后可以顺序的计算出最终结果这是某位伟人研究出的算法,在这里我们直接拿来用就可以。转换过程:——当前元素e为数字:输出——当前元素e为运算符:1.与栈顶运算符进行优先级比较2.小于等于:将栈顶元素输出,转13.大于:将当前元素e入栈——当前元素e为左括号:...
2019-12-26 22:46:00
73
原创 计算器核心解析算法(上)
计算机如何读懂四则运算表达式?9.3 + (3 - -0.11) * 5后缀表达式人类习惯的数学表达式叫做中缀表达式另外,还有一种将运算符放在数字后面的后缀表达式5 + 3——> 5 3 +1 + 2 * 3 ——> 1 2 3 * +9 + (3 - 1) *5 ——> 9 3 1 - 5* +中缀表达式符合人类的阅读和思维习惯后缀表达式符合计算机的运算方式——消除了中缀...
2019-12-24 23:17:00
51
原创 Qt中的字符串类
标准库STLQt VS STLQt中的字符串类——采用Unicode编码,意味着可以直接支持韩文、日文、中文等等。而STL中的string类不支持Unicode编码,只支持ascII码。——使用隐式共享技术来节省内存和不必要的数据拷贝——跨平台使用,不必考虑字符串的平台兼容性注意:隐式共享技术集成了深拷贝和浅拷贝优点于一身的技术。#include "QCalcul...
2019-12-23 22:47:00
69
原创 初探Qt中的消息处理
Qt消息模型Qt封装了具体操作系统的消息机制Qt遵循经典的GUI消息驱动事件模型如果你只关注两头,即用户做某个操作,那么应用程序中的消息处理函数将被调用。Qt中如何表示用户消息?用字符串来描述消息Qt中如何映射用户消息到消息处理函数?connectQt中消息映射需要遵循什么规则?信号与槽Qt中定义了与系统消息相关的概念——信号(Signal) 由操作系统产生的消息——槽(Slot)...
2019-12-22 23:10:00
47
原创 计算器界面代码重构
计算器界面代码重构什么是软件开发过程中的重构?重构(Refactoring)——以改善代码质量为目的代码重写 使其软件的设计和架构更加合理 提高软件的扩展性和维护性代码实现与代码重构不同——代码实现 按照设计编程实现,重心在于功能实现——代码重构 以提高代码质量为目的软件架构设计 区别: 代码实现时不考虑架构的好坏,只考虑功能的实现 代码重构时不能影响已实现的功能,只考虑架构的...
2019-12-22 19:50:00
28
原创 计算器程序界面分析
QLineEdit组件QLineEdit用于接受用户输入QLineEdit能够获取用户输入的字符串QLineEdit是功能性组件,需要父组件作为容器QLineEdit能够在父组件中进行定位QWidget w; //生成QWidget对象,顶级组件QLineEdit le(&w); //生成QLineEdit对象,其父组件为QWidgetle.setAlignment(Qt:...
2019-12-22 18:06:00
47
原创 Qt中的坐标系统
坐标系统GUI操作系统都有特定的坐标系统图形界面程序在坐标系统中进行窗口和部件的定位定位类型——顶级窗口部件的定位——窗口内部件的定位——窗口部件的大小设置Qt使用统一的坐标系统定位窗口部件的位置和大小Qt部件类提供成员函数在坐标系统中进行定位QWidget类提供了窗口部件所需的坐标系统成员函数为什么Qt提供三组不同的函数出来?主要就是为了跨平台#include "Widget...
2019-12-22 16:44:00
69
原创 窗口部件及窗口类型
窗口部件和窗口类型并不是Qt中才有的概念,其他的平台中也有类似的概念。图形用户界面由不同的窗口和窗口组件构成(也就是说窗口和窗口组件是图形用户界面开发中的最小单元)<QtGui>头文件包含窗口组件,对应Qt中的GUI模块Qt以组件对象的方式构建图形用户界面组件的类型:——容器类(父组件):用于包含其它的界面组件——功能类(子组件):用于实现特定的交互功能Qt中没有父组件的顶级组...
2019-12-21 23:19:00
45
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人