自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 extra text after expected end of preprocessing directive

原代码:#ifdef defined(ENABLE)**********#elifdefined(ENABLE)**********#endif会有警告Warning: #14-D: extra text after expected end of preprocessing directive发生,意思是预期预处理指令是在#ifdef后就要结束的,属于预处理用法产生的问题改为:#ifdefined(ENABLE)**********#elifdef...

2021-09-08 19:39:43 5722

转载 高并发中的线程与线程池

从CPU说起你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清晰的看清问题的本质。CPU并不知道线程、进程之类的概念。CPU只知道两件事:1. 从内存中取出指令2. 执行指令,然后回到1你看,在这里CPU确实是不知道什么进程、线程之类的概念。接下来的问题就是CPU从哪里取出指令呢?答案是来自一个被称为Program Counter(简称PC)的寄存器,也就是我们熟知的程序计数器,在这里大家不要把寄存器想的太神

2021-08-27 11:33:45 235

原创 三轴加速度计值检测碰撞和摔倒

void collision_detect(){ sensor_event_report report = {0}; uint8_t flag = acc_cache_check.state; long result = 0; uint8_t ret = 0; uint8_t temp = 0; uint8_t p = 0; uint16_t acc_x = 0; uint16_t acc_y = 0; uint16_t acc_.

2021-08-19 19:47:16 4758 6

原创 sif一线通输出协议以及代码实现

SIF协议一次传输一帧数据,传输结束后要求线路空闲状态为低电平,每次传输需一次性完整传输所有数据。 数据的电平遵守TTL 规范。1.1 信号定义Tosc定义: 250us <Tosc<2ms,推荐值:500us1、同步信号:2、Bit(0)表示方法:3、Bit(1)表示方法:1.2代码实现 需要定义一个中断定时器,定时器周期为一个Tosc,中断处理函数判断是否有数据需要发送。下面是发送数...

2021-08-12 17:53:12 4882 3

原创 QT5的程序打包(将QT5的工程项目打包成一个exe程序)

将工程打包成一个可执行文件,使用的时候就不需要在工程目录下打开,只需给需要此工具的同事仅发送个打包后的.exe文件即可需要安装的打包软件:https://enigmaprotector.com/en/downloads.html1.首先使用release方式运行2.在相应的工程目录下就会多一个如下的文件夹3....

2021-08-12 17:28:22 955 1

原创 remote: ERROR: does not match your user account.

用同事用过的电脑,想使用自己的账号push代码,但是出现以下问题,这是因为邮箱不一致导致的问题解决方案:1.先修改用户名和邮箱git config --global user.name "your name"git config --global user.mail "your mail"2.修改remote的url。通过vim .git/config进行修改...

2021-01-13 21:03:24 481

原创 armcc出现Cannot obtain license for Compiler (feature compiler) with license vension >= 3.1:Feature has

执行armcc出现下面的问题:解决办法:将C:\Program Files\ARM rvds.dat中的时间修改一下。将所有的2020替换为2021即可

2021-01-12 19:27:48 2029 1

原创 Qt实现动态波形图

功能:每一秒动态添加一个数据,可通过按钮进行控制,开始与暂停;添加spinbox控件对x轴的刻度进行控制;滚动鼠标滑轮可分别放大缩小x轴,y轴构造函数:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); calibtation = CALIBTATION_CONFIG; key ...

2021-01-07 11:45:04 2238

原创 python查看pip支持的版本

1.如果出现错误信息使用pip3 。pipdebug --verbose

2021-01-05 17:33:25 663 3

原创 Qt使用customPlot绘制曲线图

1.在官网下载customPlot所需的源码以及例子https://www.qcustomplot.com/index.php/download2.在原有的项目中添加customplot所需的源码:将.cpp和.h文件拷贝在工程目录下,在工程中添加文件3.qcustomplot中包含打印的功能,在pro工程文件中添加printsupport。确认qcustomplot已添加进工程(旧版本可能需要手动添加)greaterThan(QT_MAJOR_VERSION, 4): Q..

2021-01-05 15:33:56 3349 2

原创 使用Qt读取xls文件

1.在工程文件中添加 qaxcontainerCONFIG += c++11 qaxcontainer2.使用的头文件#include <QMessageBox>3.代码实现MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); QAxObject* exc

2021-01-04 19:12:59 803

原创 Qt入门学习--对象树,信号与槽

1.对象树 1.1 当创建的对象在堆区时,如果指定的父亲是QObject派生下来的类或者Oobject子类派生下来的类,可以不用管理释放的操作,对象会被放入对象树中,只要父类析构,子类亦会析构。一定程度上简化了内存回收机制 ...

2021-01-03 20:40:05 156

原创 Qt入门级学习--创建一个qt工程,使用按钮控件(QPushButton))

1.创建一个工程 1.1选择项目路径以及项目名称 1.2 构建套件。根据需要对于不同版本的选择。 1.3 默认创建有窗口类,myWidget,基类有三种选择:Qwidge(一个空白界面,父类)、QMainWindow(带有菜单栏,状态的界面,子类)、QDialog(带有对话框界面)。此处选择QWidget基类 1.4 创建好的工程包含.pro的工程文件,mywidget.h,main.cpp,mywidge...

2021-01-02 23:02:33 446

原创 解决missing Change-Id in commit message footer问题

每一个提交都要有一个Change-Id,出现missing Change-Id in commit message footer错误的原因就是change id丢失,解决办法其实强大的git已经告诉你怎么办了:1.在报错的下面几行,就会有这样的命令:直接copy即可2.跟着git提示走就好........

2020-04-01 11:36:57 7670

原创 git pull更新不到最新代码

(一个实习小白。。。。。。。)今天,又发现了一个错误,以前为了方便操作个分支,直接拷贝了仓库(这样完全为了节省时间,拉代码要好久),这样就一个仓库一个分支,比较方便,今天就遇到了一个问题,我想拉远程的最新代码,本地显示已经是最新的代码,使用git log查看,显示最新提交是一个月前,这不合乎情理呀,毕竟每天都有在更新代码。使用git branch -a查看远程分支,只有四个(要知道我们的库的...

2020-03-20 11:29:17 9731

原创 git commit --amend的用法

1、用于修改上次提交。应用场景:在公司,写了一个功能提交到老大,老大看了代码后,眉头一皱balabalba说一堆需要改的地方,你回来改正后,要是直接使用,git add 、git commit -m"xxxxxx"、git push那就等着被吐槽吧,这样提交会让老大那里有两条内容,这时候老大就需要合并才可以。所以为了老大更好的管理提交,你就需要,git add 、git commit --amen...

2020-01-14 17:10:33 2142

原创 【数据结构与算法】Hash表(散列表)、哈希函数、解决哈希冲突

哈希表根据之前学的内容,查找一个关键字需要对待查序列的值一一进行比较;那在查找时能不能使用一种方式减少值的比较?所以就有了哈希表的概念,根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表,通过将待查记录的关键字值和它存储位置之间建立一个确定的对应关系,则查找时不再进行关键字值间的比较,从而提高查找时的效率。哈希函数:也叫做散列函数,根据关键字值...

2019-05-14 11:01:52 263

原创 【C++】设计模式——观察者模式

观察者模式观察者模式分为两个角色:观察者和监听者;观察者的作用是观察事件,并且将发生的事件通知给对本事件感兴趣的监听者。监听者的作用是处理发生的事件。其中关键的一步是将监听者和感兴趣的事件保存起来,反过来,一个事件也会由多个监听者处理;对于特定的事件而言,这是一个一对多的关系。基本思路Listener:监听者,执行相应的事件。observable:观察者分为两个模块(1)先利用...

2019-05-12 00:11:09 229 1

原创 强符号、弱符号、强引用、弱引用

强符号与弱符号当多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候会出现符号重复定义的错误。对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的"__attribute__((weak))"来定义任何一个强符号为弱符号。需要注意的是强符号和弱符号都是针对定义来说的,而不是引用。如下面的这段程序:exter...

2019-05-11 10:05:04 702

原创 【linux】目标文件、可执行文件(ELF)格式解析

ELF文件、目标文件、可执行文件的关系目标文件是源代码经过编译但未进行链接的那些中间文件,在linux中的.o文件,它跟可执行文件的内容与结构很相似,所以一般与可执行格式采用一种方式存储,在linux下,我们可以将他们统称ELF文件。ELF文件标准里面把系统中采用ELF格式的文件归为四类:ELF文件类型 说明 实例 可重定位文件(Relocatable File)...

2019-05-10 19:09:39 5666

原创 SQL基本语句(1)

SQL的基本概念数据库:操作数据的集合。SQL语句:管理数据库,字母的大小写不敏感。SQL语句主要分为以下三类:DDL(Data Definition Languages)数据定义语言。定义了不同的数据段、数据库、表、列、索引等数据库对象的定义,简单来讲就是对数据库内部的对象进行创建、。常用的语句关键字包括create、drop、alter、show等。DML(Data Ma...

2019-05-07 12:10:44 2321

原创 预编译、编译、汇编、链接过程

预编译将源代码或者头文件经过预编译成一个.i文件。例如C++文件扩展名是.cpp,头文件的扩展名可能是.hpp,预编译后的文件扩展名是.i预编译的过程相当于下面的命令:对c语言文件的处理:gcc –E 源文件 –o目标文件对c++语言的文件的处理:g++ gcc –E 源文件 –o目标文件例如:gcc –E hello.c –o hello.i预编译需要做的工作:主要处...

2019-05-04 14:34:10 507

原创 【C++】volatile关键字的作用

volatile的作用volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中;由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中...

2019-04-29 23:59:22 4578

原创 【C++】什么情况下会产生临时变量

临时变量是只在调用期间有效,具有常性的一种变量。一、值传递在返回值以值传递(传值和传指针)的形式返回时,会生成临时变量。int sum(int a,int b){ return a + b;}编译器会将结果a+b的值拷贝给临时变量,最终返回的是临时变量;二、具有引用类型在函数调用中,如果形参是引用的类型的情况下:当实参和形参的类型不匹配会产生临时变量;...

2019-04-28 21:56:45 1984

原创 C与C++的区别(3)——指针与引用

我们在学习c语言的时候,知道函数传参有两种,值传递和地址传递;而在C++中,多了一个引用的概念,引用就是给已存在的变量取了一个别名,编译器不会给引用开辟新的空间,与其引用的变量共用一块空间。引用于指针的区别引用:引用就是对某一变量的一个别名,对引用的操作对变量直接操作完全一致;int a = 10;int *p = a;&在此不是求地址运算,而是起到标识作用。 ...

2019-04-28 17:43:01 270

原创 C与C++的区别(2)——new和malloc的区别

一、本质区别在C++中引入更多的关键字,比如:new和delete;而malloc和free是库函数,需要头文件的支持;二、申请的空间所在的位置new关键字为对象分配的空间在自由存储区内。而molloc是从堆上分配内存;C/C++内存通常分为:堆、栈、自由存储区、全局/静态存储区、常量存储区;自由存储区:是C++中通过new和delete动态分配和释放对象的抽象概念;...

2019-04-26 21:14:59 350

原创 C和C++的区别(1)——函数重载

C和C++的区别在C++中,函数重载就是在同一作用域下,函数名相同,而参数列表不同的一组函数;而在C语言中不支持函数重载;这是因为C++编译后在库中的名字与C语言的不同;假设某个函数的原型为void fun(int x,int y)。该函数被C编译器编译后的库中的名字为_fun;而被C++编译器则会产生像_fun_int_int这样的名字。函数重载(1)函数重载指的是同一作用...

2019-04-25 00:04:33 275

原创 不使用其他判断语句和第三方变量,实现两个数的交换和比较

一提到两个变量的交换与比较,一般首先都会想到使用if、? :、switch等判断语句;但在面试的时候,经常会问到不使用判断语句的情况下,如何实现两个变量的交换和比较?变量a、b找出其中比较大的一个:方法一:int max = ((a + b) + abs(a - b)) / 2方法二:int max(int a,int b){ int c = a - b;/...

2019-04-24 11:51:55 188

原创 【C++】delete与delete[]的区别

c++中对new申请的内存释放方式有delete和delect[]两种方式,那这两者到底有哪些区别呢?可能你见过这样的表述:用new分配内存,就用delect释放内存;使用new[]分配内存,就用delete[]释放内存。具体来讲就是delect释放new分配的单个对象指针指向的内存,delete[]释放new分配的对象数组指针指向的内存。那为什么会这样呢?关于动态申请的内存,分两种情况:...

2019-04-21 21:38:29 809

原创 【C++】设计模式之——工厂设计模式的原理与实现

工厂设计模式工厂设计模式提供了生成对象的最佳方法,这一设计模式的优势就在于屏蔽了生成对象复杂的过程。有三种工厂模式,分别为:简单工厂模式 工厂方法模式 抽象工厂模式简单工厂模式原理:工厂生产产品,而这里的产品指的就是对象。在简单工厂模式中,用一个标识对应一个对象的方法,要生成某一产品时,只需要传入对应的标识,这样做的优势是当需要生产大量的对象时,不需要对对象名进行记忆,并且...

2019-04-21 18:20:34 335

原创 【数据结构】希尔排序

希尔排序将原本大量记录数的记录进行分组。分割成若干个子序列,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序。基本有序:基本有序的意思就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间。像{2,1,3,6,4,7,5,8,9};但像{2,9,3,6,4,7,5,8,1}9在第二位,1在倒数第一位就谈不上基本有序。分割策略:将相距...

2019-04-20 18:20:38 146

原创 【数据结构】直接插入排序以及时间复杂度的分析

直接插入排序直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。完整代码 :#include <stdio.h>void InsertSort(int arr[],int len){ int i = 1; int temp; int j; for(i;i < len;i++) { temp ...

2019-04-20 16:57:43 7849 1

原创 【数据结构】简单选择排序以及时间复杂度的分析

简单选择排序简单选择排序法就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。如图所示:完整代码#include <stdio.h>void SimpleSelectSort(int arr[],int len){ int i = 0; int min;//记录最小值的下标 int temp; for(i;i &l...

2019-04-20 11:19:34 6941 2

原创 【操作系统】分页存储管理

三种分配存储管理方式分页式存储管理:离散分配的基本单位是页 分段式存储管理:离散分配的基本单位是段 段页式存储管理:离散分配的基本单位是段、页空间划分1)对于进程:将一个用户进程的地址空间(逻辑空间)划分成若干个大小相等的区域,称为页或页面。2)对于内存:内存空间也分成与页大小相等的区域,称为块(物理块),同样是从0开始编号。地址结构逻辑地址:逻辑地址...

2019-04-17 09:36:58 4444

原创 【c++】继承和组合混搭下的构造和析构顺序

类和类之间有三种关系:①组合关系:has_a a part of的关系②继承关系:is_a a kind if的关系③代理关系:在容器适配器中,屏蔽底层的接口,对外提供新的特性在只有的组合的关系中可直接调用构造;在继承中,先调用基类的构造,后调用派生类的构造;析构的时候只要记住,先构造的后析构,也就是先析构派生类,后析构基类即可。那么在有组合和继承混搭...

2019-04-16 11:42:36 410

原创 从面向过程到面向对象

面向过程编程面向过程编程的核心:功能分解(自顶向下,逐步求精)。就是将一个大问题分解成多个小问题,多个小问题再进行分解;解决小问题就会容易很多面向过程最重要的原则:高内聚、低耦合内聚是指模块内部各成员之间关联的紧密程度耦合是指模块与模块之间关联的紧密程度面向过程的特点: 1)分析解决问题所需要的步骤 2)利用函数实现各个步骤,解决个问题面向过程编程的主要缺点就是 ...

2019-04-16 10:51:37 241

原创 【c++】内存池的实现

使用内存池的原因:在c++开辟空间和释放空间使用的是new和delete,而new和delete是对内存的操作,对内存进行操作必然需要从用户态转到入内核态,系统在接收到分配一定大小内存请求时,首先查找内部维护的内存空闲块表,并且需要一定的算法找到合适的内存块,由此频繁的new和delect会降低效率,并且在内存中会产生外碎片。默认的内存管理函数还考虑到多线程的应用,需要在每次分配和释放内存时加...

2019-04-15 12:33:01 243

原创 【数据结构】基数排序

一、基数排序基数排序(RADIX SORT)是一种基于计数排序或者是最优桶排序。这里区分一下基数排序与桶排序基数排序只是借用十只桶来为0-9这十个基数进行排序分堆(可以说是最优的桶排序),反复的在保持稳定的情况下,对个位、十位。分别进行桶排序 桶排序里面的桶不一定是十个桶,可以是任意多的桶,只是桶的数量会影响排序的速度,桶排序主要是将元素映射到桶里面,再在各个桶里面进行排序,最后再将各个...

2019-04-11 23:23:42 510

原创 【数据结构】堆排序

一、堆堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。在堆排序中使用到大顶堆。完全二叉树的性质:●如果按照层序遍历的方式给结点从0开始编号,则结点之间满足如下关系:●如果i = 0;则结点i是二叉树的根,无双亲●如果i > 0; 对于左孩子,则其双亲是结点i/2;对于右孩子,则其双...

2019-04-11 15:29:09 189

原创 【数据结构】归并排序

一、归并排序归并排序是建立在归并上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。该算法的核心思想是二路归并。二、归并排序的介绍<1>归并排序的过程:(1)根据数组的mid值(数组的起始下标加数组的末尾下标除以二)将序列划分为2个子序列,多次向下递归,直到划分为一个子序列只包含一个数...

2019-04-02 21:13:45 187

空空如也

空空如也

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

TA关注的人

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