- 博客(92)
- 收藏
- 关注
原创 《Qt》Qt概述(二)
当我们安装好QT后,使用开始菜单找到QT栏,可以找到如下四个栏目这里安装的是QT5.14.0Assistant 5.14.0:QT的英文帮助文档Designer 5.14.0:Qt的图形化编辑界面Linguist 5.14.0:Qt的国际化语言工具,可以帮助我们将发开的工具面向国际化(翻译软件)Qt Creator:Qt的集成开发工具(我们平常开发一般都是使用的这个)新创建的项目,会自动的帮我们生成几个文件widget.hmain.cppwidget.cpp:界面开发一般在这里。
2024-02-02 14:15:35 1437
原创 《QT》QT概述(一)
开发(程序猿最关注)1)后端开发2)前端开发:又叫大前端开发3)算法工程师4)游戏开发......测试运维产品经理前端开发又有:a)网页前端开发(做网页的)b)桌面应用开发(做电脑上的应用程序的)c)移动应用开发(做手机上的应用程序的)这些前端开发又可以称之为“客户端开发”QT这个技术,就是用来做“客户端开发”的,注意QT不可以做网页和移动开发,它主要用于桌面应用开发注:目前QT官方也支持移动应用开发了,但是市场上似乎还没有什么知名的软件是QT开发的。
2024-01-30 22:46:33 939
原创 探究栈帧的奥妙
在我们进行函数调用的时候,编译器都会在栈区为这个函数维护一个栈帧,即每一个函数对应着一个栈帧,这是概念,那么我们通俗的来讲讲什么事栈帧。首先明确一点,我们在进行变量创建的时候,编译器是给这个变量分配了对应的虚拟内存的,即创建变量时,需要一定的开销,而这个开销一部分就是体现在内存占用上,那么回到函数调用这里来,和创建变量类似,函数也是一个类型,在进行调用的时候同样也需要一定的内存开销,这个函数占用的内存空间就是这个函数的栈帧,即栈帧=占用内存。
2023-10-30 13:20:58 221
原创 <数据结构>AVL树详解
AVL树又叫平衡树(Balance_Tree),笔者认为这个名字非常不错,中国嘛,就是在意阴阳平衡,之前小编还拿这个当过自己网络IP,哈哈哈。
2023-08-28 18:59:15 574
原创 <高阶数据结构>图
我们只需借助一个队列来辅助实现,这里我们先将A入队列,在A出队列的时候,将A连通的最近一层B,C,D入队列,B出队列时将E入队列,如此运行直到队列为空时,遍历结束,出队列顺序即时我们的遍历次序。从某一顶点开始,选择该顶点连接的边中权值最小的边,再到下一顶点选连接的边中最小权值的边,同样需要记录一下已经选过了的顶点。借助一个队列实现,和广度优先遍历方法有点类似,只不过这里只需要选择最小权值边的顶点。为了防止B出队列时,再次将A和C入队列,可以开一个标记容器,标记入了队列的顶点。组成:G = (V, E)
2023-08-28 15:57:31 434
原创 <数据结构>并查集
上面我们把十个人分为了不同几个小组,他们来自不同的地方,吃的口味自然不同,于是就分别让0,1,2这三个人担任组长,带领各自的队伍去吃饭。并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合。不过并查集是森林的概念,并查集的学习可以帮助我们去更好的学习图这个数据结构。2.如果该结点是双亲结点,存放一个负数,我们可以顺便存放这棵树的结点个数。我们只需要将整个数组遍历一遍,找到为负数的位置有多少个,即集合的数量。队长可以抽象的理解为头结点,组员理解为各自的孩子结点。
2023-07-16 16:17:04 592
原创 <网络>UPD协议详解
答案是不是的,这些IO类的函数,其实本质上就是一个拷贝函数,那么拷贝数据在哪去呢,在系统层面维护了一个缓冲区,这个缓冲去是UDP协议提供的,当我们调用了发送函数之后,我们是先把数据拷贝到UDP的发送缓冲区,再由UDP自己决定什么时候发送,当我们调用了接受函数之后,我们做的事是把UDP的接受缓冲区的数据,拷贝到我们用户层的缓冲中去。我们注意到, UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首。然而64K在当今的互联网环境下, 是一个非常小的数字.
2023-07-14 09:41:14 691
原创 HTTP协议
协议就是一种约定,你客户端和服务器约定了某种方式去通讯我们主机之间的连接通过硬件+代码可以实现,在这个连接好的基础上,再制定一种协议,通信双方通过这个协议的规则进行有条不紊的,有保障性的通信。其实底层呢其实也就是一种大量的文本处理,这些约定好了的特殊的文本格式,使我们通信的时候更加的有保障。
2023-07-12 18:17:48 195
原创 <网络>TCP代码协议编写
这篇文章我们就主要实现一下如何使用TCP进行完整的网络通信首先我们需要了解什么事TCP,TCP是一种传输控制协议,我们暂且先记住这个。现在我们先开始,第一呢,我们要实现客户端和服务端的网络通信,两个不同的主机之间通信是通过什么?答案是每台主机的网络IP,在我们的电脑进行上网的时候,会自动给我们的电脑分配一个该局域网内的IP。好的,现在我们的两台主机相互的找到了对方,然后再看看我们要做的是什么,两台主机之间的通信对不对!
2023-07-08 18:59:35 1234
原创 <网络编程>网络基础
了解网络发展背景,对局域网/广域网的概念认识了解网络协议意义,重点理解TCP/IP五层结构学习网络传输的基本流程,理解封装和分用。
2023-07-07 21:12:06 268
原创 <C++项目>高并发内存池
原型是goole的开源项目tcmalloc(全称:Thread-Caching Malloc),用于替代系统的内存分配相关的函数(malloc, free).知名度非常高。项目要求知识储备和难度:会用到C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁等等。什么是内存池池化技术所谓“池华技术”,就是程序先向系统申请过量的资源,内存池要解决的两个问题一)效率问题:举个例子,我们向家里要生活费,有两种方式;每次要花钱时都去找爸爸妈妈。
2023-06-22 10:57:15 849 2
原创 <网络编程>网络套接字
IP地址(公网IP, IPV4 32位),IP地址早已经不够了,采用将网络划分为局域网IP和公网IP,IP在特定的网络中保证主机唯一性。我们通信的目的是将数据传输到对方机器上面的软件客户端 -> 客户端进程, 服务器软件 -> 服务器进程。端口号:传输层协议的一个内容,用来标识一个进程(唯一性),用端口号来交付数据。,将数据在主机间转发仅仅是手段,机器收到之后,需要将数据交付给指定的进程!不可靠传输:只负责把数据给下层,其他的不管,丢包就丢包咯。可靠传输:为了保证可靠,就会设计更多的策略,保证不丢包。
2023-04-26 12:28:26 993 2
原创 <Linux>POSIX信号量
只要保证共享资源任何时刻都只有一个执行流在进行访问,就有了临界资源和临界区的概念。互斥(加锁)时候,共享资源是被当做整体使用的。如果不同线程访问的是共享资源中的不同的位置,这个共享资源就可以分开来使用,让不同的执行流访问不同的区域,就可以继续并发了。那么我们如何知道这个一共有多少个资源,还剩多少个?自己初始化的你怎么保证这个资源就是给你的?程序员编码我怎么知道我一定可以具有一个共享资源呢?信号量电影院的例子:买票的本质:叫做资源(座位)的预定机制。
2023-04-21 21:02:30 638
原创 <Linux嵌入式_点灯>
那么我们来看看我们开发板上关于发光二极管的原理图,这里我学习使用的是IMX6ULL_Linux开发板。下图,我们看到开发板上已经默认给LED灯正极一个3V3的拉高高电平了,我们想要点亮它只需要在另外一端。翻看参考手册,在700页我们看到,GPIO1的时钟在CCM_CCGR1中设置,为了简便我们可以把所有的外设时钟都打开,将CCM_CCGR0~6写入0xffffffff即可。查看相关原理图,我们看到,和LED0相关的外设是GPIO1的IO3,我们首先打开GPIO1的外设时钟。4、设置GPIO使用哪个IO口。
2023-04-02 20:56:29 623
原创 <Linux>system v通信
首先我们梳理一遍进程的创建,当我们创建进程A时,操作系统对进程遵循的是先描述在组织的管理方式,要描述就需要创建特定的数据结构来进行存储相应的描述数据,所以操作系统会为A创建对应的数据结构,这其中会创建一个task_struct结构体来记录这个进程的相关数据,同时操作系统会对每一个进程创建一个进程地址空间mm_struct,而task_struct里面有一个指针来指向这个进程地址空间,不清楚进程地址空间的,可以先将它想象成操作系统为这个进程画的大饼,告诉这个进程:你可以使用很多的内存,即虚假的内存。
2023-03-09 16:40:57 565
原创 <Linux>进程池 -- 练习
注意要实现的是父进程对子进程的通信,发送数据的只有一个进程,而管道是通过fd文件描述符来实现通信的,所以我们需要记录每一个子进程对应的管道,以此来建立父进程对多个子进程之间的联系。(隐藏的意思就是我们只需要对子进程的对应的管道文件发送数据,就可基本实现通信了)这里实现的进程池:一个父进程对多个子进程进行管道通信,大致如下。以下代码,是根据所列的框架所写的,可以参考。知道需要创建几个子进程来进行通信。和这些子进程创建同数量的管道。三、具体的接收和发送实现处理。实现子进程的数据接收。实现父进程的数据发送。
2023-03-07 08:20:46 265
原创 <Linux>进程间通信--管道
管道一般用于父子间通信。管道具有通过进程间协同,提供的访问控制。管道提供的是面向流式的通信服务 -- 字节流。管道是基于文件的,文件的生命周期是随进程的,管道也是。管道是单向通信的,是半双工的一种特殊情况。
2023-03-06 15:20:30 725 1
原创 <Linux>vscode搭建Linux远程开发工具
下载完Remote - SSH 后,左边会多出来一个电脑的图标,打开就会发现刚刚添加的服务器IP.(如果没有可能是没刷新,退出重进一下试试),右键我们的添加的服务器IP,出现的两个选项任选一个。在vscode中我们可以直接使用Linux终端的命令行进行代码的编译和运行(省略了我们大部分的配置时间)打开左上角的资源管理器,选择打开文件,我这里是已经打开了(会让你在输入一次密码)弹出以下的界面,输入我们的服务器账户密码即可连接成功。这里推荐的是去国内的镜像网站去下载。然后就可以进行文件和代码的编写了。
2023-02-20 19:14:39 670
原创 <C++>手撕搜索二叉树
搜索二叉树主要实现的是K或K/Value模型,这里我们使用K模型来定义,即可以用O(N)的时间复杂度来进行K值的搜索。使用模板来定义{K _key;{}};
2022-11-30 21:22:39 928
原创 <C++>深度学习多态
多态是不同继承关系的类对象,去调用同一函数,产生了不同的行为;比如如下例子:Student继承了PersonPerson对象买全票Student对象买半票{public:virtual void BuyTicket() { cout
2022-11-24 23:36:37 916
原创 <C++>深度学习继承
一定不要设计出多继承多继承可以说是C++的缺陷之一继承和组合public继承是一种is-a的关系,也就是说每一个派生类对象都是一个基类;组合是一种has-a的关系,假设B组合了A,每一个对象中都有一个A对象;优先使用对象组合,而不是继承继承允许你根据基类的实现来定义派生类的实现继承一定程度破坏了类的封装,基类的改变对派生类的影响很大对象组合和基类间的依赖关系很强,耦合度高对象组合是类继承之外的另外一种复用选择实际尽量多去使用组合。
2022-11-20 00:15:34 634
原创 <Linux>基础IO_文件描述符
显然不是的,程序在我们写的时候,是写在磁盘上的,在程序没有运行起来时,就是一堆没有用的数据,只有我们将程序生成的可执行程序运行起来的时候,OS会在内存中创建一个进程,这个进程是动起来的,而我们写的程序是在进程创建成功后才有效,所以。如果我们想要访问文件,那么本质就是需要我们去操作硬件,去实现硬件的IO操作,但是我们用户是没有权限去直接操作硬件的,我们只能通过操作系统提供的系统接口,通过这些接口去告诉操作系统我们想要做什么,从而间接的访问硬件进行文件的写入等操作。那么在内核中,如何看待被打开的文件?
2022-10-31 00:44:40 598
原创 <算法入门>_基础入门篇一
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。这里我们需要的是查找数组arr最小值,其本质就是排除,我们需要找到一个能够迅速排除其他元素的方法,我们从题目中知道这个数组是旋转的,且旋转前是非递减的,那么我们就可以用二分法的思想:旋转后的数组分为两部分,且两部分都是非递减的,我们就需要确定最小值的区间,我们用。输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位 于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
2022-10-16 19:34:04 1697 8
原创 <C++>模板进阶
模板【优点】:1、模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此产生2、增强了代码的灵活性(重复的工作交给编译器去做)模板【缺陷】:1、模板会导致代码膨胀的问题,也会导致编译的时间变长2、出现了模板编译错误时,错误信息非常凌乱,不易定位错误。
2022-10-08 18:13:22 705
原创 STM32入门100步
下图按下唤醒键接通VCC电源,输入高电平,达到唤醒的效果,那么平时就需要低电平的状态,我们用一个电阻接地,由于电阻较大,那么就会提供 一个弱弱的的低电平,就会保持一个低电平的状态。CRC:用于数据正确性的校验,对于要加载的数据进行处理得到一个计算结果,再将这个数据和计算结果一起发送过去,接收端的数据通过CRC再进行处理,再将处理的计算结果和发送端CRC的结果比较,如果两者相同则数据正确,否则数据错误。中断是指一个突发事件,终止了CPU当前的工作,转而处理突发事件,处理完成后,再回到当前的工作继续执行。
2022-09-29 13:01:51 22747 8
原创 <Linux>简单的shell解释器
shell解释器:就像下面Centos的环境下的命令行,可以解析我们输入的指令来达到运行不同功能的实现;shelll条件:必须是永不退出的,常驻内存的,我们使用死循环来解决;输入的命令又指令和指令选项:ls -a -l,我们使用命令分割来进行区分命令分割后解析需要子进程来运行解析后的指令对应的进程,这里需要运行其他进程,但是又不能影响父进程,我们创建子进程用execvp进行程序替换,来实现运行不同指令的效果;
2022-09-29 13:00:07 582
原创 <Linux>进程控制
fork后父子进程是全部包括之前的代码都共享;fork创建子进程(内核数据结构(OS创建) + 进程代码和数据(一般从磁盘中来,也就是C/C++程序加载之后的结果));创建子进程,给子进程分配对应的内核结构,必须是子进程自己独有的,因为进程具有独立性,理论上,子进程也要有自己的代码和数据,可是一般而言,我们没有加载的过程,也就是说,子进程没有自己的代码和数据,所以子进程只能使用父进程的代码和数据那么:代码:都是不可修改的,只能读取,所以父子共享是没有问题的!数据:可能被修改的,所以必须分离!
2022-09-19 22:44:53 486
原创 <Linux>进程地址空间
程序打印地址,是进程打印地址,是程序运行之后打印的地址。每一个进程都有一个地址空间!讲个故事例子:有一个大富翁 有10亿美金 还有3个私生子。大富翁给每一个私生子都画10亿美金的饼,大富翁面对每一个私生子都需要画对应的饼。我们将其对应起来大富翁 -- 操作系统,10亿美金 -- 地址空间,私生子 -- 进程。那么地址空间就相当于操作系统给进程画的大饼,是一个虚拟的空间。内核中的地址空间本质也一定是一种数据结构。将来要和一个特定的进程关联起来。
2022-09-16 10:10:29 891 6
原创 <C++>初始化列表_static成员_友元
类外部的函数是不能访问类的私有成员的,使用友元就可以使其能够访问类的私有成员。对于构造函数,如上代码,在创建对象时,调用构造函数后,类成员会有一个初始值,但这样并不是初始化,在类中定义类,比如在A类中定义B类,B类就是A的友元类,但A不是B的友元类。在类中声明外部定义的类,外部定义的类就可以访问这个类中的私有成员了。2、引用成员变量、const成员变量、没有默认构造函数的自定义类。在类中的成员变量是所有这个类共享的,且只能在类外定义和初始化。在类中声明外部定义的函数,外部的函数就可以访问类中的私有成员。..
2022-08-16 19:59:51 482 4
原创 <C++>构造_拷贝_析构_运算符重载函数_const成员函数
C++的class类中有几个特殊函数,它们的调用不是人为调用的,而是编译器自动调用的。其中的构造函数就是一个在创建对象时自动调用的特殊函数。一般用于对象的初始化操作,这可以避免C语言中写着写着就忘记初始化的场景。我们将创建对象时默认调用的构造函数叫做默认构造函数,我们可以将默认构造函数分为:无参默认构造,全缺省默认构造,编译器自己默认生成的默认构造。...
2022-08-15 16:04:16 387
原创 【Linux】vim_gcc_动静态库
一款多模式编辑器vim工具有三种基本模式:命令模式、插入模式、底行模式控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁 的编辑模式。文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,shift+: 即可进入该模 式。要查看你的所有模式:打开vim,底行模式直接输入。...
2022-08-04 19:43:57 218
原创 【Linux】权限-粘滞位
就是只要用户具有目录的写权限,用户就可以删除目录中的文件,而不论这个用户是否有这个文件的写权限.每一个用户对于的权限都是3位,这就很简单了,又该权限标记为1,没有为0,在将其二进制转换为八进制。当一个目录被设置为"粘滞位"(用chmod+t),则该目录下的文件只能由。chmod+t目录名设置粘滞位权限,一般由root设置。因为文件和目录的权限还要经过文件掩码的修饰。常用选项-R递归修改文件或目录的所属组。功能修改文件或目录的所属组。规定文件的八进制默认权限是。...
2022-07-23 16:22:59 1280
原创 【C++】类和对象_(1)
//类体由成员函数和成员变量组成};//一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式1、1.声明和定义全部放在类体中,需注意成员函数如果在类中定义,编译器可能会将其当成内联函数处理。K2.类声明放在.h文件中,成员函数定义放在.cpp文件中,...
2022-07-18 15:45:10 217
原创 【C++】inline内联函数、auto关键字、nullptr
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。3.为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法4.auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。...
2022-07-17 12:46:13 622
原创 【Linux】基本指令_(2)
目录1、more2、less3、head4、tail5、时间相关的指令1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下2.在设定时间方面3.时间戳6、cal7、find :(灰常重要) -name8、grep9、zip/unzip10、tar11、bc12、uname13、重要的热键14、关机15、wc16、xargs17、| 管道18、输出输入重定向、追加重定向>:输出重定向>>:追加重定向...
2022-07-14 10:36:02 181
原创 【Linux】基本指令_(1)
目录1、ls2、pwd3、cd4、touch5、mkdir6、rmdir & rm7、man8、cp9、mv10、cat语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:语法: pwd功能:显示用户当前所在的目录Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。语法: cd 目录名功能:改变工作目录。将当前工作目录改变到指定的目录下。语法:touch [选项]... 文件...功能:touc
2022-07-13 09:03:23 121
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人