自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

年少轻狂,幸福时光

--事物的难度远远低于对事物的恐惧

  • 博客(118)
  • 资源 (1)
  • 收藏
  • 关注

原创 定义算法的框架 - 模板方法模式

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。“组件协作” 模式通常包含 1、模板方法模式 2、观察者模式 3、策略模式这篇文章中我们首先来了解模板方法模式,其他两个模式在后续的文章中了解熟悉。只要写过面向对象的程序,用过一些框架,都会使用过模板方法模式,比方QT中实现线程,那么我们一般会编写一个继承QThread的子类,然后在子类中重写...

2020-07-31 10:51:36 649

原创 Mysql中sql语句的处理顺序

与C/C++等大多数语言不同的是,C/C++的处理逻辑是顺序处理,即处理顺序与我们编码的顺序几乎一致,而sql语言的处理却不是按编码顺序执行的,而总是从from开始处理。下边做个sql语句编写与处理的顺序对比编写顺序:select dinstinct ... from ... join ... on ... where .. group by ... having ... order by ... limit ...处理顺序:from ... on ... join ... where ... ..

2020-07-30 11:47:23 431

原创 第四载、FAT12文件系统剖析2

在上一章节《FAT12文件系统剖析1》中,我们把a.img启动软盘使用FreeDos系统格式化为FAT12文件系统的组织方式,并且向a.img软盘写入两个文件,同时通过FreeDos操作系统也查看了a.img软盘中的文件。之所以这么做,是因为主引导程序不可以超过512字节,所以主引导程序需要在基本的初始化工作完成后加载启动介质(这里是软盘a.img)中的启动程序到内存,然后跳转到对应内存处执行。...

2020-05-08 10:50:49 692

原创 第三载、FAT12文件系统剖析1

在上一篇文章中,我们完成了一个简单的主引导程序的编写及运行,但有限制的是:主引导程序不能超过512字节!然而操作系统的程序,明显不止512字节,为了突破这个限制,主引导可以采用如下改造策略: 1、完成最基本的初始化工作 2、从存储介质加载程序到内存中 3、将控制权交给新加载的程序执行在这里,主引导程序主要做简单初始化、加载程序到内存,跳到加载的程序处...

2020-04-27 23:41:26 547

原创 第二载、第一个操作系统程序,"Hello OS" 尝鲜

学编程逃不过的真香定律:一个程序永远是打印一行"Hello Word",那么这章节,我们也来编写一个可独立运行于x86架构的程序(注意,这里是脱离操作系统的)。在上一篇我们说了,BIOS会加载启动介质中的主引导程序,主引导程序是一个由汇编语言完成的软件,并且存储在启动介质的前512字节处,入口地址为0x7C00,以0x55AA结束。主引导程序的入口地址0x7C00类比到C语言中,就是main函...

2020-04-26 23:34:28 505

原创 第一载、初识操作系统

易经有云:“伏羲一划开天地,太极生两仪,两仪生四象,四象生八卦”,而八卦的种种组合,得到六十四卦,世间万物都可以用这六十四卦来解释。 软件开发与易经描述的卦象,有异曲同工之处,现今种类繁多的编程语言、开发框架,好比六十四卦,追根溯源,终究会回归到最初的太极图;软件开发而言,这些开发语言、框架,也就最终都会回归到操作系统。所以有了操作系统连载篇章,记录自己学习操作系统的历程。...

2020-04-23 23:34:58 459

原创 第七载:makefile中的条件判断

makefile跟编程语言一样,也支持条件判断,方式大同小异,makefile条件判断语句的语法如下:虽然有集中形式,但是推荐使用第一种,其比较符合我们的编程习惯(尤其从事C/C++派系的工作人员),需要注意的是,ifxxx前边不能为tab键(因为不是命令),()中也不允许有空格,否则会报错,这里ifxxx是泛指集中判断类型,具体的如下:可以支持 ifeq ... else ... ...

2019-09-22 19:47:16 378

原创 第六载:makefile变量的高级主题

在makefile中,我们已经知道变量的基本赋值方法、使用等,但是在makefile中,变量还有一些高级的属性,掌握这些属性,可以使编写的makefile更加高效,现在就来了解下makefile中变量的高级属性 一、变量值的替换 - makefile支持使用指定字符(串)替换变量值中的后缀字符(串) - 语法格式为:$(var:a=b) 或者 $...

2019-09-22 14:41:08 313

原创 第五载:预定义变量的使用

在makefile中,存在一些预定义的变量,我们可以直接使用他们,预定义的变量可分为自动变量与特殊变量 1、 自动变量 $@ 表示目标 $^ 表示目标的所有依赖 $< 表示目标的第一个依赖all : first second third @echo "\$$@ => $@" @ec...

2019-09-21 09:08:30 309

原创 第四载:makefile中变量的赋值方式

makefile类似于脚本程序,当然也支持程序里边变量的概念,makefile中的变量只是文本数据(字符串),没有C语言中的数字等,并且大小写敏感。 makefile中的变量有4种赋值方式: - 简单赋值( := )(最常用) - 递归赋值( = ) - 条件赋值( ?= ) - 追加赋值( += ) 对于变量的使用,与C语言不同的是,需要...

2019-09-21 00:39:09 988

原创 第三载:makefile中的伪目标

在前边的两个章节中,我们提到了makefile中的目标,并且知道这个目标存在且依赖没有更新,make就不再编译程序。一般在默认的情况下 - make 认为目标对应着一个文件(可执行程序、so库等等) - 比较目标文件和依赖的新旧关系,决定是否执行命令 - make以文件处理作为第一优先级clean : rm *.o hello.out在上边的一个...

2019-09-20 08:43:51 443

原创 第二载:makefile的结构

在上一篇中,我们只是简单的介绍了make跟makefile的基本概念,并且实现了一个简单的makefile,但是那个makefile仅仅是做一些打印工作,并没有什么实际性用途。在编写真正可用的makefile前,我们先来了解下makefile的结构。 前边也提到,makefile的意义在于: 1、makefile用于定义源文件间的依赖关系 2、makefile说明如...

2019-09-19 09:02:29 359

原创 第一载:初识make与makefile

我们写程序完成后,都需要进行编译才能运行,在一些集成的IDE(如vs2010、QT等),都提供有一键编译的功能,整个编译过程(预处理、编译、链接),IDE已经帮我们屏蔽了。但是在嵌入式或Linux平台下的开发,基本都是通过make跟makefile来管理整个工程项目,即源码与源码之间如何关联、依赖等等。除此之外,学习make跟makefile,可以使得开发人员对于程序的编译过程有更深层次的...

2019-09-19 00:32:19 358

原创 排序算法之 - 归并排序

这一章节所讲的归并排序,跟希尔排序一样,也是一种效率很高的排序方法,也同样采用了分而治之的方法.归并排序的基本思想为:先把无序序列一分为二,然后分别对两边的序列进行排序,最后再整合两边已经排好的序列.下边已一张图来展示归并排序的思想(图是借用网友的,见做的非常简洁易懂,便引用之)从途中我们看到,二分后的两边序列,又进行二分归并处理,直到两边的序列不能二分为止.这就是采用的递归思想,出...

2019-05-12 23:52:06 158

原创 排序算法之 - 希尔排序(基于选择排序,插入排序)

之前说的选择,插入,冒泡三种基本排序,时间复杂度都为O平方,直到希尔排序的出现,打破了O平方的魔咒.希尔排序的基本思想我理解是属于分而治之,把一个无序序列划分为若干个子序列,再分别对这写子序列使用三种基本排序方法进行排序.下边直接看示意图:要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序为升序排序第一次划分:假设间隔d = ...

2019-05-12 23:24:19 702

原创 排序算法之 - 冒泡排序

与选择排序,插入排序一样,冒泡排序也是常规的排序法之一,冒泡排序的思想主要放在"冒泡"二字. 这个冒泡排序算法有点想水中的泡泡往上冒一样,水中的泡泡月往上变得越大,冒泡排序思想跟这个是一样的. 冒泡排序思想:取最后一个元素,往前遍历并与遍历的元素比较,符合交换规则(或大或小),那么交换位置,接着往前遍历,知道遍历到已经排好序的序列为止,那么此时这个元素就是极大/极小值,也就...

2019-05-12 12:16:04 327

原创 排序算法之 - 插入排序

与选择排序,冒泡排序一样,插入排序也是常规的排序法之一,插入排序的思想主要放在"插入"二字,主要就是从待排序列中取第一个待排元素,然后与其前面已排序列的元素比较,比较成功(或大或小),那么就把这个已排元素往后挪一个位置,空出来的位置就是插入的位置,依次循环.下边来看个示意图: 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序...

2019-05-12 11:48:19 150

原创 排序算法之 - 选择排序

所谓排序,就是把一系列同类型的元素按照一定规则顺序排好.选择排序也是其中的方法之一,选择排序的思想主要放在"选择"二字,主要就是从待排序的序列中寻找最大/最小值,然后放到已经排好序的下一个交换位置,下边来看个示意图: 要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14}; (红色代表已排序列,黑色代表待排序列,绿色代表...

2019-05-11 22:41:52 173

原创 确保对象的唯一性 - 单例模式

单例模式在我们的日常开发中用的非常多,单例模式最大的特点就是只能生成一个类对象。 比方配置文件的类信息,就可以使用单例模式实现,因为配置文件是固定的,不论在代码的哪个位置获取配置项信息,得到的都应该是相同的信息。 既然只能生成一个类对象,那么我们就得考虑下如何实现这个只生成一个对象,在C++中我们知道,当定义或new一个对象时,就会调用构造函数,构造函数的执行成功,才宣誓...

2019-05-04 21:53:35 448

原创 算法随笔-替换字符串中的子串

在我们的项目里,经常会将字符串中的指定的内容替换为我们需要的内容,这里我们就来实现这这个小算法。具体需求则为:将字符串中的指定子串替换为设置的字符串,并返回替换的总数,实现比较简单,主要是指针的运算,下边直接代码展示:#include <iostream>#include <string.h>#include <stdio.h>int S...

2019-05-04 20:29:07 1714

原创 对象的克隆 - 原型模式

在西游记中,我们常看到孙悟空用自己的猴毛变出很多个特征跟自己一模一样的"孙悟空"来, 可能仅仅是名字不一样,孙悟空二弟、孙悟空三弟、孙悟空四弟,除了名字不一样外,其他的特征完全一模一样,这个通过孙悟空创建出的多个跟自己一模一样的克隆品,在设计模式里头,我们称之为:原型模式 在开始讲解之前,还是以一个场景来描述下这个需求,在我们工作中,常常要写日报,一个小组内的成员日报格式一样,那...

2019-04-27 23:45:49 192

原创 - 工厂设计模式(简单工厂、工厂方法、抽象工厂)

工厂模式是最常用的创建型模式之一,在开始工厂模式之前,我们先来看一个场景,假如要设计一个电脑类,生成的电脑对象要包含CPU,那么可能有人会这么设计:class PC{private: string m_CPU;public: PC(string nPCName) { if("Apple" == nPCName) { ...

2019-04-27 12:27:36 291

原创 算法随笔-单词翻转(输入"abc def",返回 "def abc")

设计一个算法,将字符串中的单词首尾翻转,例如: 输入:"abc def",那么输出为:"def abc",这里我采用的是使用两个指针从字符串尾部开始往前遍历,遇到间隔符便提取一个单词,代码实现比较简单,直接上代码,如下:void reversal(char* nSrc, char* nResult, char* nSplit){ //可增加参数合法性判断 c...

2019-04-25 21:44:05 923

原创 解决大批量数据插入mysql问题:使用mysqlimport工具从文件中导入

在我们日常项目中,经常会涉及对mysql数据库的读写操作,当需要大批量导入数据时,使用传统的insert方式,会使效率非常慢,解决的办法有:1、拼接sql 2、使用存储过程 3、使用工具从文件中导入。在这里我们要介绍的是使用mysqlimport工具导入。一般来说,在我们安装完成mysql后,该工具已经安装好了,直接使用即可。 首先来了解下mysqlimport工具的基本配置...

2019-04-23 21:35:33 1232

原创 Redis客户端发生 : (error) MISCONF Redis is configured to save RDB snapshots... 错误解决办法

在使用redis客户 端时,执行命令有时候会发生如下错误127.0.0.1:6379&gt; incrby index 2(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may m...

2019-03-05 07:14:26 739

原创 Redis安装配置与启动停止

Redis是一个开源、高性能、基于键值对的缓存与存储系统,与 关系型数据库不同,作为NoSql的Redis数据库,其将所有的数据都存储在内存中,这就使得Redis 的读写速度远远高于mysql/Oracle等关系型数据库,使其成为了一款非常优秀的缓存数据库! 一、下边来说说Redis的安装,这里我是直接安装在Linux 上,首先可以从官网下载源码包:https://red...

2019-03-03 20:55:59 230

原创 算法随笔 - 求V型排序与倒V型排序数组的极值

现在来写一个求极值的算法,需求为:假设有一个整形数组,数值排列顺序为V型,即数值由大到小,再由小到大,例如int array[] = {100,99,93,92,91,89,12,9,7,5,3,1,6,8,87,123},现在要求的就是array的最小值,及其下标;类似的有倒V型排序的数组,求最大值及其下标,例如int array1[] = {1,2,3,4,12,34,45,56,78,5,3...

2019-02-18 19:23:47 1740

原创 算法随笔 - 判断一个字符串是否对称

    今天来实现一个基础算法:判断一个字符串是否对称。例如 char str[] = "abcdcba",这样的字符串便是对称的。实现很简单,主要是指针操作即可,下边直接上代码//头文件#ifndef __LMSPUBLICLIB_H__#define __LMSPUBLICLIB_H__#include &lt;stdio.h&gt;#include &lt;unistd.h&...

2019-02-18 15:37:27 1220

原创 算法随笔 - 判定一个字符串是否为另一个字符串的前串和后串

    19年的第一个周末,把上周在公司划水摸鱼偷偷写的一个小程序搬到博客上来,这里搬的是:判断一个字符串是否为另一个字符串的前串。 比方有个char str[] = "hello my 2019! keep moving!",那么给一个子串,假如为 char str1[] = "hello",我们要实现的就是判断 str1是否为str的前串,给定char str2[] = "moving!",判...

2019-02-16 15:38:57 572

原创 算法随笔-根据指定分隔符分割字符串

    新的一年到来,第一周总是没什么状态,就随便写写简单的一些算法,今天就来实现一个字符串分割。    需求为:根据指定分割符,分割字符串,并将分割好的各个子串存入vector向量中。举例:假如存在字符串char str[] = "123,456,789,abc,def",那么按逗号','作为分割符,最终vector向量中的内容便为:vector&lt;string&gt; result ...

2019-02-14 22:52:11 740

原创 第八载:makefile中函数定义及调用

在Makefile中,是支持函数使用的,Makefile中的函数包括make解释器自身预定义的函数,同时也支持我们自己定义函数。在Makefile中, 通过define关键字来实现函数的自定义,并以endef关键字结束,自定义函数使用预定义函数call调用,后边跟自定义函数名及参数,如下就是一个简单的自定义函数:.PHONY : testdefine fun1 @echo "...

2018-12-23 11:31:43 6503

原创 C++中的类模板

    前边我们知道,C++中的泛型编程,有函数模板和类模板两种形式,我们之前已经对函数模板做了分析,这章我们就对类模板做个分析。将模板的思想应用于类,我们就可以只关注类的功能实现,不需要关注具体数据元素的类型,这种思想非常适用于编写数据结构相关的代码,比如数组类、线性表、栈和堆等,只需要实现他们的逻辑功能,不必关注具体的数据类型。    C++中的类模板与函数模板一样,都是使用templat...

2018-08-24 11:25:16 765 1

原创 C++中的函数模板

之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各的优缺点 宏定义: - 优点:代码复用,适合所有的类型 - 缺点:缺少类型检查,宏在预处理阶段就被替换掉,编译器并不知道宏的存在 函数: - 优点:真正的函数调用,编译器对类型进行检查 - 缺点:类型不同需要重复定义函数,代码无法复用上边两种方式...

2018-08-23 19:57:54 64384 22

原创 C++中的抽象类与接口

    在面向对象编程时,有一些抽象的概念,而且可以从生活中映射过来,比方如何求一个图形的面积?这里的问题就是:没说明是求什么图形的面积,所以就求不出图形的面积,但是图形在我们生活中却是一个实实在在存在的概念,没有具体的对象实例。    同样在面向对象编程中,这个抽象的概念就对应到抽象类        - 抽象类可用于表示现实世界中的抽象概念        - 抽象类是一种只能定义类型,不...

2018-08-23 16:58:57 526

原创 C++中的对象模型分析

到目前为止,我们都是使用class关键字来定义类,其实在C++中,class是一种特殊的struct    - 在内存中class依旧像struct一样,可以看作变量的集合    - class与struct遵循相同的内存对齐规则    - class中的成员函数与成员变量是分开存放的        - 每个对象拥有独立的成员变量        - 所有对象共享类中的成员函数 #i...

2018-08-23 12:24:10 462

原创 C++中的多态特性

    前边我们知道,C++类之间有继承关系,子类能够哦继承父类并且拥有父类的属性,也能够定义子类自己的属性,古语就是:青出于蓝而胜于蓝。    但是子类中是否可以定义父类中的同名成员,使用时如何区分该成员是父类中的还是子类中的?下边代码来验证一下#include &lt;iostream&gt;using namespace std;class parent{public:...

2018-08-22 18:40:39 717

原创 C++数据结构-单链表创建

    前边我们创建了顺序存储结构的线性表,简称顺序表,顺序表最大的问题是:插入和删除需要移动大量的元素。为了解决 这个问题, 我们引入链式存储结构的线性表,简称链表,链表与顺序表不同,链表的每个结点在内存中是分开存放的,每个结点都包含数据域和指针域:    - 数据域 :存储数据元素本身    - 指针域 :存储相邻结点的地址链式存储结构的线性表有    - 单链表:每个结点只包含...

2018-08-22 00:20:25 8142 2

原创 C++数据结构数组类的创建

    在C或C++的原生数组里,有一点不好的就是数组越界是察觉不到,代码也不会提醒,至于越界产生的bug什么时候引发系统问题,我们也无从知晓。在这里我们可以创建一个数组类,内部包含数组长度、数组越界访问时能主动发现。    数组类的创建我们还是按照顺序表的思路,创建一个Array类,实现基本的操作,再创建StaticArray与DynamicArray一个静态一个动态数组类,数组存储位置及大...

2018-08-18 20:30:23 4898

原创 C++数据结构-线性表顺序存储结构设计

线性表的顺序存储结构:指的是用一段地址连续的存储单元一次存储线性表中的数据元素,如下:有了以上概念,我们可以使用一维数组来实现线性表的顺序存储结构,    存储空间:T* m_marry    当前长度:int m_length整个类继承于之前我们写的List类,并采用泛型编程,在这里我们把顺序表分为静态顺序表与动态顺序表,静态顺序表的存储空间是直接在栈上分配的,通过类模板来定义空间长...

2018-08-13 23:40:32 1076

原创 C++数据结构线性表的本质和操作

    线性表(List)定义:具有相同类型的n(n≥0)个数据元素的有限序列    (a0, a1, a2, ... , an-1),ai是数据元素,n是表长度线性表(List)具有如下性质:    - a0为线性表的第一个元素,只有一个后继    - an-1 为线性表的最后一个元素,只有一个前驱    - 除了a0与an-1外的其他元素ai,既有前驱又有 后继   - 直接支持...

2018-08-12 23:29:51 331

《玩转嵌入式多任务程序设计——RT-Thread权威指南》

操作系统只是一个工具,就好比画笔一样,你对画笔的结构研究的再透彻,对如何作画帮助也是非常有限的。本文档主要描述嵌入式操作系统基本思想:什么是"上下文"?什么是"任务"?什么是"多任务"?什么是"调度模型"等等........

2017-09-03

空空如也

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

TA关注的人

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