自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 DBus的理解与应用

DBus连接 (通用部分)DBus Name 是用来给应用程序进行标识自己的,所以每当程序连上 DBus Daemon 后,就会分配到一个 Unique Name同时应用程序还可以要求自己分配另一个 Well-know name (通过 dbus_bus_request_name 函数)。// 让应用程序和 DBus 之间取得连接conn = dbus_bus_get(DBUS_BUS_SESSION, &err);if (dbus_error_is_set(&err))

2021-07-08 10:27:38 1968 1

原创 基础查找和排序算法

算法数据结构中的算法,指的是数据结构所具备的功能解决特定问题的方法,它是前辈的一些优秀的经验总结算法的基本特征:(了解)有穷性(Finiteness)算法的有穷性是指算法必须能在执行有限个步骤之后终止;确切性(Definiteness)算法的每一步骤必须有确切的定义;输入项(Input)一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;输出项(Output)一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;可

2021-06-22 10:49:23 279

原创 Linux环境编程复习

1、静态库和共享库的区别优缺点静态库:就是目标文件的集合,调用静态库文件就是把静态库中的二进制指令拷贝到可执行文件中​ code.c + math.a​ 优点:运行速度相对比共享库较快,可执行文件运行时不需要依赖静态库​ 缺点:可执行文件相对较大,当静态库修改后,可执行文件需要重新编译共享库:​ 就是没入口的可执行文件的集合,调用共享库时就是记录共享库二进制的指针的位置即可,当执行可执行文件时共享库文件就会一起加载到内存中,可执行文件就可以跳转到共享库中运行​ 优点:可执行文件相对较小,当共

2021-06-21 20:23:22 162

原创 C语言面试复习

1、C代码变成可执行文件的过程:预处理:把源文件翻译成预处理文件gcc -E code.c 显示预处理的结果​ gcc -E code.c -o code.i 生成以.i结尾的预处理文件编译:​ 把预处理文件翻译成汇编文件​ gcc -S code.i 生成以.s结尾的汇编文件汇编:​ 把汇编文件翻译成二进制的目标文件​ gcc -c code.s 生成以.o结尾的目标文件链接:​ 把若干个目标文件合并成一个可执行文件​ gcc code.o a.o b.

2021-06-21 19:48:48 219

原创 C++面试复习

malloc/free 与 new/delete 区别malloc/freenew/delete身份函数运算符/关键字返回值void*带类型的指针参数字符个数(手动计算)类型,自动计算字节数失败返回NULL抛异常 std::bad_alloc构造/析构不调用自动调用初始化不能初始化可以初始化指定的值头文件包含头文件直接使用什么是内联函数内联函数也会被翻译成二进制指令,调用语句不会生成跳转语句,而直接把函数的二进制

2021-06-17 20:24:39 111

原创 Qt网络通信TCP

网络通信​ Qt中进行网络通信时,需要在.pro文件中的 QT 添加 network模块。​ 注意:Qt应用程序的主线程要用来维护界面,因此不能使用阻塞模式来读取数据。1、QHostAddress​ 用来表示网络地址​ QHostAddress(const QString &address); 以字符串方式创建网络地址类。​ toString 把ip地址转换成字符​ 特殊地址:QHostAddress::Null,QHostAddress::Broadcas

2021-06-10 21:32:50 1333 2

原创 Qt线程 互斥量 读写锁 条件等待 信号量

Qt线程1、Qt线程介绍Qt程序默认只有一个线程,而该线程要时刻响应界面,所以Qt中设计了信号和槽机制,当执行一个操作时,界面会发出信号,然后槽函数响应并执行,然后再返回界面,当执行一个耗时较长的操作时,界面会卡住。所有当需要执行耗时较操作时,更适合让新的线程去完成。2、QThread类Qt中提供了一个线程类,所以在Qt中使用线程非常方便。该类无法指定入口函数,需要继承该类,然后覆盖run函数,作为线程的入口函数。start函数负责启动线程,当它调用后,run函数就开始执行。注意:一旦从ru

2021-06-10 21:31:31 2171

原创 Qt绘图类

Qt绘图​ 在Qt中使用QPainter类绘制图形、图片,但该类只能工作在painterEvent事件函数中,因此必须覆盖此函数。(1) 在控件上绘制图片​ 1、创建image对象,需要提供图文件的路径。 2、QPainter对象,需要提供控件的地址。 3、调用它drawImage函数,绘制图片,需要提供一个绘制区域。 sx,sy,ex,ey。图片自适应QImage image("../image/1.JPG");this->resize(image

2021-06-10 21:29:09 561

原创 Qt显示图片 & 定时器

显示图片1、准备好图片文件,一般存储在项目的image目录下2、选中项目,右击选择添加新文件 -> Qt -> Qt资源文件 -> 输入文件名3、打开资源文件,添加 -> 添加前缀 -> 添加 -> 添加文件4、在设计器中,改样式表时选择 -> 添加资源 -> background-image,会自动出现备选图片5、也可以通过setStyleSheet函数设置控件的背景图片作业:实现一个摇奖器​ 单纯在循环中设置背景图片无法让界面轮流显示图片,因

2021-06-10 21:28:03 867

原创 Qt控件介绍(输入类控件、显示类控件、控件容器)

一、输入类控件QLineEdit​ 单选文本框,主要用来从界面获取数据,常用于获取用户名密码。​ 常用设置:​ 字体字号设置​ 垂直、水平对齐设置​ 只读设置​ 输入模式:​ Normal 正常模式​ NoEcho 不显示输入的内容​ PassWord 以 *代码输入的内容​ PassWordEchoOnEdit

2021-06-10 21:25:27 3569

原创 Qt 自定义信号与槽 & 事件

一、自定义信号与槽当某些条件触发时,想自动执行一些代码,这种情况就需要用到自定义信号和槽。1、信号和槽必须是类的成员2、自定义信号和槽的类必须继承QObject,由于QObject是所有类的源头,它们都继承了QObject,所以继承任何一个Qt中的类即可3、在类的开头位置写 Q_Object 不需要分号​ 注意:此标识符必须在项目构建之前写,如果是后加入的编译时可能出现槽函数、信号找不到​ 解决方法:删除项目中所有自动生成的文件,然后再使用​ qmake -project​ qmake

2021-06-10 21:24:00 820

原创 Qt界面编程基础

一、Qt简介1、什么是Qt:​ 是使用C++语言封装的一套用于图形界面编程的框架,Qt专注但不局限于图形界面的开发,还支持系统调用、网络编程、数据库编程、2D/3D图形处理、音视频处理等。​ 它是跨平台了,支持几乎所有的主流操作系统,Linux、Windwos、MacOS、Android、iOS等系统。2、为什么选择Qt​ 基于C++,简单易用​ 优良的跨平台特性,在个人计算机、工控、嵌入式 的界面占主导地位二、Qt环境与工具​ 1、头文件和库文件​

2021-06-10 21:22:26 4526 1

原创 STL模板库

STL模板库STL是Standard Template Library缩写,中文名字叫标准库模板,由惠普实验室提供,共有三类内容:算法:以函数模板形式实现的常用算法,如:max、min、swap、find、sort容器:以类模板形式实现的常用数据结构,如:栈、队列、链式表、顺序表、红黑树迭代器:它是容器的成员,用于帮助访问容器中的元素,使用方法类似于指针find#include <algorithm>iterator find( iterator start, iterator e

2021-06-09 09:58:49 176

原创 C++模板技术

一、什么是模板是一种自动生成代码的技术,这种技术能让程序员在编写代码时不需要考虑数据类型,这种技术被称为泛型编程技术二、为什么使用模板1、C/C++是一种静态编程语言(预处理->编译->汇编->连接->可执行文件),静态语言的优点就是运行速度比较快,而缺点是实现通用的代码比较麻烦。任务:实现一个通用的快速排序算法。2、借助回调模式实现通用代码,实现难度高,使用也比较麻烦。3、借助宏函数实现通用代码,类型检查不严格、没有返回值、容易出错。4、借助函数重载实现通用代码,会使

2021-06-09 09:58:06 729

原创 C++文件IO

一、I/O流​ C++把对文件的读写操作都封装在了以下类中:​ ofstream 对文件的写操作,继承了ostream类的功能​ ifstream 对文件的读操作,继承了istream类的功能​ fstream 对文件的读写操作,继承了ofstream、ifstream类的功能二、C++对文件进行读写的步骤:1、创建流对象,打开文件#include <fstream>void open( const char *filename);void open( const char *

2021-06-09 09:57:37 177

原创 继承、多态、虚函数 工厂模式

一、什么是继承1、当我们解决问题时,先查看现有的类能否解决一部分问题,如果有则继承该类,在此类的基础上进行拓展来解决问题,来缩短解决问题的时间(代码复用)2、当遇到一个复杂问题时,可以先把复杂问题分解成若干个小问题,如何为每个问题设计一个类进行解决,最终通过继承语法把这些类汇总到一个类中,达到解决问题的目的,以此降低解决问题的难度,同时也可以让多个程序员同时解决该问题二、继承的语法1、继承表class Test : 继承表[继承方式 父类]{ 成员变量;public: 成员函数;}2

2021-06-09 09:56:53 226

原创 重载运算符(友元 哑元)

一、运算符函数在C++中会把运算符当作函数处理,一个表达式其实是调用了很多运算符函数完成计算的,这种特性对内建类型没有用,但是对自建类型数据,却可以进行个性化设计,提高代码的可读性和易用性,如:string类String str;str += “hehe”;str1 == str2运算符函数的格式:单目运算符:​ #o | o# 会被编译器解释为​ 成员函数:​ [] o::operator#(void)​ {​ }​ 返回值不确定,唯一参数是调用者​ 全局函数:​

2021-06-09 09:55:34 317

原创 C++基础day04

拷贝构造与赋值操作​ 拷贝构造是一种特殊的构造函数,格式为:​ 类名(const 类名& that) // 可以但不限制const​ {​ }​ 什么时候调用拷贝构造:​ 当使用旧对象给新对象初始化时,会自动调用拷贝构造​ Test t;​ Test t1 = t; // 会自动调用拷贝构造​ 拷贝构造的任务:​ 顾名思义拷贝构造负责把旧对象中的成员变量拷贝给新对象,且编译器默认就会生成具有该功能的函数什么时候应该显式实现拷贝构造:​ 普通情况下编译器生成的拷贝构造完全够

2021-06-09 09:52:23 61

原创 C++基础day03

一、对象的创建和销毁过程1、对象的创建过程a、给对象划分内存空间(栈、堆)b、执行初始化列表 根据继承表顺序调用父类的无参构造函数,也可以调用有参构造,类名(参数) 根据成员的定义顺序调用类类型成员的无参构造函数,也可以调用有参构造,成员名(参数) 初始化其它成员c、执行构造函数,申请资源2、对象的销毁过程a、执行析构函数,释放资源b、根据成员的定义顺序,逆序调用类类型成员的析构函数c、根据继承表顺序,逆序调用父类的析构函数

2021-06-09 09:51:17 61

原创 C++基础day02

一、默认形参1、什么是默认形参在C++中可以给函数的参数设置默认值,当函数被调用时如果调用者提供了实参则使用实参,如果没提供则使用默认值。2、默认形参要靠右如果函数有多个参数,设置了默认形参要从右到左连续排列。3、只在声明设置设置默认形参如果函数的声明和定义分开实现,只在函数声明时设置默认形参即,否则会出现语法错误。4、默认形参可能会影响重载的效果如果对函数进行了重载双设置的默认形参,调用时可能会造成冲突。因此为重载过的函数设置默认形参时一定要慎重。三、内联函数1、普通函数​

2021-06-09 09:50:43 76

原创 C++基础day01

一、C++介绍本贾尼 . 尼特芝斯特鲁普, 于1979年4月份在贝尔实验室在分析UNIX系统分布内核的流量时,特别希望有一种更加模块化的工具,于是在1979年10月开始着手开发一种新的编程语言,在C的基础上增加了面向对象机制、这就是C++,在1983年完成了C++的第一个版本。C++与C的重要区别:​ 1、C++完全兼容C的所有内容​ 2、支持面向对象的编程思想​ 3、支持运算符重载、函数重载的编译时多态机制​ 4、泛型编程、模板​ 5、支持异常处理​ 6、类型检查更严格​ 注意:学习C+

2021-06-09 09:49:16 65

原创 生产者与消费者模型

生产者与消费者模型:生产者:生产数据的线程消费者:使用、处理数据的线程缓冲区:隔离生产者和消费者,这样可以避免互相等待,提高运行效率。生产者快于消费者:缓冲区会爆满消费者快于生产者:缓冲区一直空使用条件变量可以解决生产者和消费者之间效率不匹配的问题生产者快于消费者,通知消费者加速消费,生产者睡眠降低生产速度消费者快于生产者,通知生产者加速生产,消费者睡眠降低消费速度#include <stdio.h>#include <pthread.h>#include &l

2021-06-08 15:58:22 65

原创 Linux线程管理 使用生产者消费者模型和队列封装线程池

线程管理:什么是线程:​ 线程就是进程中负责执行的部分,是进程内部的控制序列。​ 它是轻量级的,没有自己独立的内存资源、代码段、数据段、堆区、环境变量、命令行参数、文件描符、 信息处理函数、当前的工作目录​ 线程拥有独立的栈内存,也就是它自己独立的局部变量​ 一个进程中至少有一个线程,我们把它叫做主线程,也可以再创建多个线程​ 注意:进程是个资源单位,而线程是个执行单位,线程是进程的一部分,进程中正是有了线程才能动起来POSIX线程​ 1、早期各计算机厂商自己提供私有的线程库

2021-06-08 15:57:26 138

原创 多路复用 select poll epoll

多路复用:使用一个进程(且只有主线程)同监控若干个文件描述符的读写,这种读写模式叫多路复用。多用于TCP的服务端,用于监控客户端的连接和数据的收发​ 优点:不需要频繁地创建进程、销毁进程,从而节约了内存资源、时间资源,也避免了进程之间的竞争、等 待。​ 缺点:单个客户端的任务不能太耗时,否则其他客户端就会感知到​ 适合并发量高,但任务短小的情景,如:Web服务器selectint select(int nfds, fd_set *readfds, fd_set *writefds,

2021-06-08 15:53:49 83

原创 网络通信UDP/TCP

网络通信UDPint socket(int domain, int type, int protocol);功能:创建socket对象domain: AF_INET 基于ipv4的网络通信type: SOCK_DGRAM 数据报 UDPprotocol: 特殊协议,一般写0即可返回值:socket对象的描述符,错误返回负值 适用于SOCK_DGRAM报文通信的函数 UDPssize_t sendto(int sockfd, const void *buf, size_t len,

2021-06-08 15:50:29 66

原创 预处理 & 条件变量 & 宏

预处理指令程序员所编写的代码并不能被真正编译器所编译,所以需要一段程序把代码翻译一下。翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都是预处理指令。查看预处理的结果:​ gcc -E code.c 直接把预处理结果显示到终端上​ gcc -E code.c -o code.i 把预处理的结果储存到code.i 文件中预处理指令的分类:​ #include 文件包含​ #include <> 从系统指定的目录下查找并导入头文件​ #include “” 先从文件

2021-06-07 10:55:38 468 4

原创 Linux环境C 进程及进程间通信

进程基本概念:1、进程与程序​ 程序就是储存在磁盘上的可执行文件,程序被加载到内存中开始运行进程。​ 一个程序被多次加载时就生成了多个进程​ 进程就是处于活动状态的计算机程序2、进程的分类​ 进程一般分为三种类型:交互进程、批处理进程、守护进程​ 守护进程一般处于活跃状态,运行在后台,由系统在开机时通过启动脚本来自动创建3、 查看进程​ 简单方式 ps 显示当前用户有控制终端的进程信息​ 列表方式 ps auxw 显示所有进程详细信息​ a 所有用户的有控制终端的进程

2021-06-07 10:54:22 236

原创 Linux环境C 信号处理

信号处理基本概念:1、中断:当程序接收信息后中止当前执行的程序,转而执行其他任务,等其他任务执行完成后再 返回,这种执行模式叫中断,分为硬件中断和软件中断2、信号是一种软件中断,由操作系统发出,程序接收到会执行相应操作3、常见的信号SIGINT(2) Ctrl+c 终止SIGQUIT(3) Ctrl+\ 终止+coreSIGFPE(8) 除0 终止+coreSIGKILL(9) 终止信号 终止SIGSEGV(11) 非法访问内存 终止+core注意:kill -l 查看Linux所

2021-06-07 10:51:43 289

原创 Linux环境C 文件管理

系统调用:(系统调用API)系统调用就是操作系统提供的一些功能供程序员调用,这些系统调用已经被封装成了C函数的形式,但它们不是标准C的一部分一般应用程序运行在用户态(03G),使用系统调用时进入内核态进行系统调用(34G)常用的标准库函数大部分时间都运行在用户态,底层偶尔也会调用系统调用,从而进入内核态 malloc系统调用的代码时内核的一部分,其外部接口以共享库函数形式提供(linux-gate.sold-linux.so)并且这些接口的实现利用软中断进入到内核执行其真正的系统调用代码。time

2021-06-07 10:49:21 327 1

原创 Linux环境C 内存管理

一、内存管理用户层​ STL 自动分配/自动释放 调用C++​ C++ new/delete 调用C​ C malloc/free 调用POSIX​ POSIX brk/sbrk 调用Linux​ Linux mmap/munmap 调用内核kernal​ 系统层​ kernal kmalloc/vmalloc 调用驱动​ driver get_free_page二、进程映像程序是存储在磁盘上的可执行文件,当程

2021-06-07 10:46:57 161 1

原创 Linux C语言 系统介绍

UNIX系统介绍:最早版本的UNIX诞生于1970年的贝尔实验室,作者丹尼斯.里奇和肯汤普逊是最早的多用户、多任务、支持多种CPU处理器架构,高安全性、高可靠性、高稳定性的系统既能架构大型关键性的商用服务器,也能支持嵌入式设备Minix基于微内核架构的类UNIX操作系统,由此Linux之父林纳斯.托瓦兹受到了启发,才开发了第一个版本的LinuxLinux系统介绍:Linux,全称GNU/Linux,其内核由林纳斯·托瓦兹于1991年首次发布,是一个基于POSIX(可移植操作系统接口)的多用户、多

2021-06-07 10:44:10 576

原创 C语言 文件读写

文件的分类:​ 文本文件: 储存的是ASCII码值的二进制​ 二进制文件:储存的是数据的补码文件IO:​ FILE *fopen(const char *path, const char *mode);​ 功能:打开或者创建文件​ path:文件的路径​ mode:打开模式​ r 以只读权限打开文件,如果该文件不存在,则打开失败,返回空指针FILE* frp = fopen("./test.txt","r"); if(NULL == frp){ prrror("fopen");//

2021-06-07 10:38:38 138

原创 C语言 字符串常用函数

字符串的常用函数:功能:计算字符串长度,但是结果不包括’\0’返回值:返回字符串中字符的个数#include <string.h>(size_t strlen(const char *s);功能:把src拷贝到dest中,相当于给dest赋值返回值:dest(链式调用)char *strcpy(char *dest,const char *src);功能:从src位置中拷贝n个字节到dest中void *memcpy(void *dest, const void *src,

2021-06-06 16:13:09 134

原创 malloc & 字符串

malloc内存管理机制:​ 当首次使用malloc申请内存时,malloc会向操作系统申请内存,操作系统会直接给malloc分配33页(一页 = 4096字节)内存交给malloc管理。但是不意味着你可以越界访问,因为malloc可能会把使用权分给”其他人“,这就会导致脏数据。每个内存块之间都会有一些空隙(4~12),这些空隙一些是为了内存数据对齐(加快读取),其中一定会有4个字节是用于记录malloc维护信息,这些维护信息决定了下次malloc分配内存的位置,以及借助这个维护信息计算出每个内存块的大

2021-06-06 16:11:50 2674

原创 指针数组与数组指针 & 堆内存

指针数组与数组指针:​ 指针数组:是由指针组成的数组,它的成员都是指针变量​ 类型* arr[长度];int arr[10] = {1,2,3,4,5,6,7,8,9,10};int* arrp[10];for(int i = 0; i<10; i++){ arrp[i] = &arr[i]; printf("%d %d\n",*arrp[i],arr[i]);}​ 数组指针:专门执行数组的指针​ 类型 (*arr)[长度];int arr[5] =

2021-06-06 16:05:36 198

原创 初识指针 & 练习

什么是指针:指针是一种特殊的数据类型,使用它可以定义指针变量,指针变量中存储的是整型数据,代表了内存的编号,通过这个编号可以访问到对应的内存。为什么使用指针:1、由于函数与函数之间是相互独立的,但是有些时候需要共享变量​ 传参是单向值传递​ 全局变量尽量少用,容易命名冲突​ 使用数组还需要传递长度​ 函数的命名空间是相互独立的,但是地址空间是同一个,所以指针可以解决这个问题2、由于函数传参是值传递(内存拷贝),对于字节数较多的变量,值传递的效率比较低,如果传递的是变量的地址,只需要传

2021-06-06 16:02:07 84

原创 进程映像 & 类型限定符 & 递归

设计函数的准则:一个函数最好只解决一个问题,这样可以降低出错率,提高可读性。最好不要依赖其他函数。(降低耦合性)数据由调用者提供,返回结果给调用者(提高通用性)要考虑调用者提供的非法数据,可以通过返回值方式告诉调用者,后者把可能出现的情况通过注释的方式写明白(健壮性)进程映像:程序:储存在磁盘上的可执行文件(二进制文件、脚本文件)进程:正在系统中运行的程序进程映像:指的是进程内存的分布情况text 代码段(只读段): 存储二进制指令、常量,权限是只读,强制修改会产生段错误data 数

2021-06-06 16:00:58 214

原创 初识函数 & 练习题

函数:function 方法一段具有某项功能的代码的集合,是C语言中管理代码的最小单位把代码封装成一个个的函数,是为了方便管理和调用代码。函数的分类:标准库函数:​ C语言标准委员会为C语言以函数形式提供的一些基础的功能,被封装在libc.so库中,使用时需要包含头文件,只需要 函数名(参数) 调用即可。系统函数:(不是函数)​ 是操作系统以函数接口形式提供的一些功能,这些功能包括:​ 内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程通信、线程同步、网络通信第三方库函

2021-06-06 15:55:57 79

原创 二维数组和练习题

二维数组:一维数组当作是把变量排成一排,通过编号来访问二维数组相当于把变量排成一个矩阵,通过行号和列号来访问定义: 类型 数组名[行数] [l列数];​ int arr[3] [5];**使用:**数组名[行下标] [列下标]​ 行下标:0到行数-1​ 列下标:0到列数-1遍历:两层for循环配合,一般外层循环负责遍历行,内层循环负责遍历列。**初始化:**类型 数组名[行数] [列数] = {{第一行},{第二行},{第三行}…};​ int arr[3] [5]

2021-06-06 15:54:05 3166

原创 数组 及试题

数组:**什么是数组:**相同类型变量的组合,是一种批量定义变量的方式**定义:**类型 数据名[数量];​ int num1,num2,num3,num4,num5;​ =int arr[5];使用: 数组名[下标];​ arr[0] ==num1 arr[4] == num5​ 数组的下标从0开始,从0到n-1**遍历:**与for循环配合使用,使用循环变量作为数组下标int arr[5] = {1,2,3,4,5};for(int i=0;i<5;i++)

2021-06-06 15:49:46 106

空空如也

空空如也

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

TA关注的人

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