自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 泛型编程和模板

设计一个数组类型(class Array),这个数组有可能只能存放 int 类型的元素,但是你在代码中使用这个数组的时候却不一定总是 int 类型的元素,可能需要数组能够存放其他类型的元素。所以,数组元素的类型,应该可以独立表示,类似于函数的参数,可以在实例化数组的时候,可以传递一个类型参数指定数组中的元素类型。理解和掌握模板是学习、应用和研究以及扩充STL的基础(STL就是使用模版实现的模板函数和模板类),而STL模板实例中又充斥着大量的模板特化和偏特化。的时候会使用下面的特化模板。

2024-11-21 14:07:16 128 1

原创 右值引用和移动语义

1。

2024-11-15 19:57:10 96

原创 迭代器模式

1。

2024-11-15 19:56:09 131

原创 网络编程基础知识

2. 认识常见的网络设备和网络名词。4. 端口号 (prot)

2024-10-29 17:07:09 560

原创 QT信号和槽

信号和槽是一种通信机制,用于 Qt 对象之间的通信Qt 对象: QObject 类及其派生类的对象,称为 Qt 对象信号和槽的本质就是函数当一个Qt对象的内部状态发生改变时,就可以发出一个信号当一个Qt对象收到这个信号后,就可以执行指定的功能信号和槽的连接: QObject 类提供了一个函数connect(),用于连接两个Qt 对象的信号和槽 对于Qt对象的通信,Qt系统需要了解如下信息:

2024-10-28 21:02:37 426

原创 QT基础入门

主流的平台都支持,如Windows、Linux、Android、MacOS ...有现成的库可供使用,不需要从零开始,节省时间/精力/金钱,提高开发效率...主要用于GUI程序开发,但又不仅仅是GUI,也可用于后台或底层程序开发。Qt始于1991年,中间历经多个版本,目前主流使用的是Qt5。4. 执行(ctr+r)03 Qt程序补充说明。

2024-10-28 16:14:16 650

原创 QT环境配置

编译器路径: /usr/local/arm/5.4.0/usr/bin/arm-linux-gcc (写实际路径,此处仅供参考)编译器路径: /usr/local/arm/5.4.0/usr/bin/arm-linux-g++ (写实际路径,此处仅供参考)点击添加,在弹出的文件对话框中,找到ARM版本的qmake (应该是在/opt/qt-armlib-591/bin 目录下)2. 找到QtCreator的菜单--->工具--->选项--->构建和运行。名称: arm-linux-gcc。

2024-10-28 12:04:57 209

原创 智能指针(unique_ptr,shared_ptr,weak_ptr)

简单的理解,智能指针在申请堆内存空间的同时,会为其配备一个整形值(初始值为1),每当有新对象使用此堆内存时,该整形值+1,反之,每当使用此堆内存的对象被释放时,该整形值减1,当堆空间对应的整形值为0时,即表明不再有对象使用它,该堆空间就会被释放掉。在某些场景中,自定义释放规则是很有必要的,比如,对于申请的动态数组来说,shared_ptr 指针默认的释放规则是不支持释放数组的,只能自定义对应的释放规则,才能正确地释放申请的堆内存。// 开辟了一块空间。

2024-10-27 23:01:13 237

原创 线程支持库(C++11)

能够阻塞一个线程,或者同时阻塞多个线程,直到条件变量表示的”条件“成立,并且被其他地方通知。C++的线程类就是包装了POSIX标准的线程接口,所以在编译的时候需要链接多线程库。条件不满足的时候,线程可以等待这个条件,当条件满足的时候,线程可以继续往下运行。既然线程需要提供一个线程函数,在线程实例化的时候,需要有一个"线程函数"std::thread t{线程函数,线程函数的参数......};构造一个线程类的对象,需要提供一个参数(线程函数)// 实例化一个线程对象,创建成功之后,就会自动运行。

2024-10-26 17:11:09 978

原创 标准模板库(STL)

STL中许多的算法,如:排序、查找...算法,在执行的过程中会对容器中的元素进行比较(

2024-10-24 00:51:04 611

原创 C++多态

如果基类的析构函数不是虚函数(不会发生动态绑定,不会调用实际指向的对象的函数版本),此时只会调用基类本身的析构函数,而不会调用派生类的析构函数,可能造成资源浪费。也就是说,当我们使用指针(引用)的时候,我们并不清楚该指针(引用)实际指向的对象的真实类型,指向的对象可能是基类对象,也有可能是派生类对象。当虚函数的声明和定义分开的时候,只需要在声明的地方加上virtual的说明,定义的时候,不能再加上virtual说明了(virtual只需要出现在类里面)

2024-10-23 01:34:37 329

原创 C++继承

虚继承不影响虚继承的派生类本身的使用(B、C,但是会在B、C里面添加一个虚基类指针,基类虚基类的偏移量),只会影响到从指定了虚基类的派生类中进一步派生出来的D,为了达到共享的目的,派生类D的所有直接基类子对象(B、C)中都不在包含虚基类子对象(A),而是把虚基类子对象放到了所以成员变量的最后面,然后直接基类子对象(B、C)只需要记录指定虚基类子对象偏移当前基类子对象多少个字节就可以了!由于在派生类中,含有基类的所有成员(具备基类的一切的能力),所以,我们能够把公有继承的派生类对象当成基类对象来使用。

2024-10-21 18:20:45 284

原创 可调用对象和Lambda表达式

这些算法在使用的时候,都需要接受一个“一元谓词对象”(可调用对象)用来描述一个条件。find_if:查找算法,可以在一个指定区间内查找一个符合条件的元素。如果一个类实现了"函数调用运算符()"的重载,那么这个类的对象称为函数对象(仿函数)在标准库中,有很多常用的算法(全局变量)都使用到了函数对象。可以携带附加的数据,函数对象可以拥有自己的属性和行为。Lambda表达式(匿名函数)函数对象和普通函数相比较,函数对象有什么好处?函数对象的行为,类似于函数,可以被调用。02 lambda匿名函数用法详解。

2024-10-18 09:11:10 276

原创 运算符重载

因为类的非静态成员函数必须通过对象去调用,编译器默认使用运算符左侧的对象调用该运算符函数,隐式的通过this把左侧的操作数对象传递到函数内部,把运算符右侧的操作数作为函数的参数, 所以重载为类的非静态成员函数,则双目运算符只有一个参数。给已经存在的运算符,添加新的功能,使它能够作用于特定的自定义类型(让自定义类型也能够实现运算操作),但是我们不能改变原有语义,操作数个数,结合性和优先级,当然你也不能创造新的运算符。C++中的运算符(+,-,*,/,=,==,!// 也可以直接像普通的成员函数一样调用。

2024-10-15 23:49:39 277

原创 this指针—静态成员—单例模式

C语言只有全局函数,最开始的时候,成员函数都是被翻译为全局函数,对于 t1.show() 这样通过一个对象调用成员函数的语句也只能翻译为全局函数的调用。但是,当我们想在程序中表示某一个对象的时候,并且这个对象永远只会存在一个,无论在哪里创建/访问都只会用到哪个唯一的实例,就会有"类只能实例化一个对象"的需求。程序在运行的时候,通常每一个类都会实例化很多个对象,如:string类的实例,当有100个字符串时,string就会实例化100个string类型的对象。// s1是一个指针:(s1->*q)();

2024-10-14 22:00:50 892 1

原创 字符串—迭代器—友元

​​​​​​​。

2024-10-14 00:07:11 322

原创 ✔类型转换和异常

/ 有问题,因为0x01020304是自己杜撰的地址,有可能不存在,有可能不能访问。传统的类型转换,功能是非常强大的,可以进行任意类型之间的类型转换(但是不能保证正确性)b. 抛出异常 --- 有错误了我们需要将一些异常值给抛出来,被检测到。基类和派生类之间的转换,而且必须包含虚函数,否则编译不通过。只能用于良性转换(可以进行隐式转换的地方)类型 变量 = (目标类型)表达式;(2) C++中新增的类型转换。

2024-10-13 17:28:56 509

原创 并发——笔试面试总结

(4) 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。而线程是共享进程中的数据,使用相同的地址空间,因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。(2) 线程是程序执行的基本单位,也是处理器调度的基本单位,但进程不是,两者均可并发执行。

2024-10-13 01:09:52 687

原创 递归函数设计技巧

例如:证明 1 + 3 + 5 + 7 +......+ (2n - 1) = n^2。第一步:证明p(1) : p(1) = 1 = 1^2。第二步:假设p(k)正确------>证明p(k+1)2. 递归函数设计的三个重要部分。1. 拿起武器:数学归纳法。第三步:证毕p(n)正确。

2024-10-03 16:54:21 325

原创 并发——线程

3. 唤醒等待条件变量的线程 pthread_cond_signal。2)获取调用者自己的线程ID:pthread_self。二. linux下面线程(thread)函数的API。3)进程与线程的区别。

2024-09-24 17:22:09 845

原创 进程间通信——信号量

该操作是在访问完共享资源(执行完临界区代码)后要做的一个操作,就是将该信号量的值+1。3. POSIX 无名信号量 -----> 内核中。2. POSIX 无名信号量 ----> 内存中。1. POSIX 有名信号量。

2024-09-24 17:05:06 791

原创 进程间通信——共享内存(shm)

两个进程,p1,p2同时访问共享内存区域(语法是没有问题的),按道理说,p1和p2执行完毕后,*p应该为200000。(4) p2进程发送一个信号给p1进程,从而达到两个进程同时++ps -ef 查看进程号。(3) 有名管道:两。

2024-09-24 14:49:32 1060

原创 进程间通信——信号

不同的信号值(整数),代表不同的含义(OS设定好的),当然用户可以自定义信号,自定义信号的含义和值由程序员来决定和解释。信号是进程间通信的一种方式,这种方式没有传输用户数据,只是在内核中传一个信号(整数),(3)捕捉信号:改变信号的处理方式 signal。3. linux下信号相关的 API 函数。信号的本质是一个整数值。

2024-09-23 23:11:26 356

原创 进程间通信——管道

它在文件系统中是没有名字(没有inode......)的,它的内容在内核中(而不是存在于硬盘),访问pipe的方式是通过文件系统的 API(read / write)pipe在创建的时候,在内核中开辟一块缓冲区,作为pipe文件的内容的存储空间,同时返回两个文件描述符(一个用来读,一个用来写)fifo 是在 pipe 的基础上,给fifo在文件系统中创建一个 inode(它在文件系统中就会有一个文件名),但是文件的内容却在内核中!半双工:通信双方,同一时刻,只能有一方进行发送,另一方接收,比如:对讲机。

2024-09-23 21:11:00 732

原创 ✔并发——进程

fork之后,操作系统会copy出一个与父进程完全相同的子进程(申请一个进程控制块用于描述子进程),这两个进程共享代码段的空间(指令),但是数据段是相互独立的,子进程的数据是从父进程地址空间中copy过来的,指令指针(PC)也完全相同(copy后,父进程运行到哪里,子进程也会运行到哪里)前台:shell终端就是前台,在shell终端上运行的进程(会影响终端),可以称之为前台进程/交互进程。数据结构:用来表示人们思维对象的抽象概念的物理表现叫做数据(对问题中抽象出来的实体)在linux中是如何描述进程的——

2024-09-23 20:30:14 690

原创 嵌入式软件工程师——技术面总结

说明:一个进程由进程控制块、数据段、代码段组成,进程本身不可以运行程序,而是像一个容器一样,先创建出一个主线程,分配给主线程一定的系统资源,这时候就可以在主线程开始实现各种功能。线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分配的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。这样的函数又叫作静态函数。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

2024-09-18 17:22:43 700

原创 1184. 公交站间的距离

【代码】1184. 公交站间的距离。

2024-09-16 17:36:23 261

原创 ✔3290. 最高乘法得分

【代码】✔3290. 最高乘法得分。

2024-09-15 23:19:03 224

原创 ✔2848. 与车相交的点

【代码】2848. 与车相交的点。

2024-09-15 21:05:08 273

原创 蓝牙模块—BLE-CC41-A

练习:编写代码,把超声波获取的距离每隔 2000 ms 发送到手机端进行查看。

2024-09-15 17:54:42 1030

原创 HC-SR04—超声波测距模块

(3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超波从发射到返回的时间。TRIG -----> DCMI_D5 -----> PB6 -----> 输出 ECHO -----> DCMI_D7 -----> PE6 -----> 输入。1. 此模块不宜带电连接, 若要带电连接, 则先让模块的 GND 端先连接, 否则会影响模块的正常工作。2. 测距时,被测物体的面积不少于 0.5 平方米且平面尽量要求平整,否则影响测量的结果。VCC 供 5V电源。

2024-09-14 22:57:23 1543

原创 系统 IO

✔3. 读写文件 (read / write),这两个步骤是作为一个整体来执行的,不会被中断。是一个好习惯,特别是当你不再需要它时。,但在很多情况下,复制完成后关闭。的返回值,并在失败时适当处理错误。(1) 打开文件 (open)文件本身的内容(用户数据)的两个文件描述符必须是有效的。是一个原子操作,即它先关闭。1. 文件IO是什么?如果已打开),然后将。

2024-09-13 17:59:45 1419

原创 stm32—SPI

【代码】stm32—SPI。

2024-09-12 21:22:15 1957

原创 嵌入式软件工程师——人事面总结

我叫孙聪,目前就读于邵阳学院信息科学与工程学院,专业为物联网工程,很高兴能够参加这次面试,我应聘的岗位是嵌入式软件工程师,在校期间我曾担任创新创业协会会长,拥有较强的接受能力,能够快速适应工作环境,

2024-09-10 23:56:35 203

原创 引用和拷贝构造函数

所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题(避免产生临时对象)用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性(避免通过引用修改目标变量,提高程序的健壮性)下面的情况中,要求编译器省略对象的拷贝构造函数,直接将对象构造到他们本来要拷贝到的存储空间!

2024-09-09 18:03:54 201

原创 构造函数和析构函数

所以,对象的初始化往往不仅仅是对成员变量的赋值那么简单,也可能还需要进行一些动态内存分配,打开文件等复杂的操作,这种情况下,我们就不能以初始化基本类型的方式来对对象进行初始化了....2. 构造函数没有返回值类型,也不能写void,可以有参数(可以重载,可以有很多个构造函数),参数可以设置默认值,不能产生二义性。不要因为构造函数的名称而认为构造函数负责为对象分配空间,构造函数在执行的时候,对象的内存空间就已经分配好了,构造函数的作用只是给成员变量赋值,初始化资源。// 匹配对应的构造函数。

2024-09-09 10:09:45 825

原创 面向对象编程思想(✔)

但是,当问题的规模越来越大、越来越复杂时,面向过程就显得力不从心了,即修改了某个 结构体,就不得不修改与之相关的所有过程函数,而一个过程函数的修改,往往又会设计到其他数据结构,在规模比较小的时候容易解决,但是当系统规模越来越大时,特别是涉及到了多人协作开发,这就非常困难,这就是著名的软件危机。继承可以在原来的基础上很快的产生新的对象;从上面的问题中,我们可以得到一个结果,面向对象和面向过程并不是相互独立的,而是相互包含的,在面向对象的这种思维中是包含了面向过程的,而面向过程也是可以包含面向对象的。

2024-09-08 17:28:22 216

原创 ()第一个C++程序

2. 声明 MON,TUE,WED,THU,FRI,SAT,SUN为符号常量,也叫做枚举常量,可以直接使用,默认值是0~6。原有的C体系中的部分头文件仍然以.h的形式存在,还有部分头文件被升级到C++体系中,在原有的名字前面加一个字符c,把后面的.h去掉了。编译器在编译的时候,就会将函数的函数体复制到函数的调用点,那么在函数调用的时候就不需要跳转到函数定义的地方,也不需要在函数运行完毕的时候跳转回来。在传统的枚举中,枚举量的值是暴露在最外层的作用域的,这样如果在同一个作用域下面有两个不同的枚举类型。

2024-09-08 01:10:01 615

原创 stm32—时钟、定时器和看门狗

毛刺”时期是不正常的,我们应该要略过它,略过的意思是指当B的信号发生改变时我们不应该立马去读输出值,而是应该等待一段时间,等电路(如:&门)将数据处理完毕后,再去读取输出值此时才是准确的。为什么会有这样的现象呢?输入信号经过"输入捕获阶段"(数字滤波,多路复用,预分频,去噪等等)到信号检测,当检测到需要的信号状态(上升沿变化 / 下降沿变化)变化时,就会把定时器时基单元中的TIMx_CNT 计数器值,锁定到"输入捕获寄存器"中。用来将定时器的总线时钟进行分频,提供一个合适的频率,给计数器去计数。

2024-09-03 11:34:53 1048

原创 stm32—中断

为了尽量节省中断响应的时间,它事先为每一个中断事件设置一个编号,并且不同的中断的中断处理程序的地址,也要事先指定好(就如同现实中找东西,我们每次把东西放在一个固定的位置能很快找到)那么每一个中断处理程序所在的地址,都是根据中断编号的顺序存储在一个数组(函数指针数组)中的,这个数组就是我们的中断向量表。所以当产生了一个特定的中断事件时,CPU就可以以最快的速度到指定的地址去执行中断处理程序。现代CPU架构为了能够及时响应外部或内部的一些紧急事件,都支持中断,并且会提供相应的中断响应机制。

2024-09-02 10:31:53 1733

空空如也

空空如也

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

TA关注的人

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