- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 C语言预处理
源程序经编译器编译一般有如下几个过程预处理:完成头文件展开,条件编译,会先完成去注释,再进行宏替换。编译:将C语言翻译成汇编汇编:将汇编转译成二进制链接:将二进制文件链接成可执行程序。
2023-04-26 14:23:13
148
1
原创 Vscode配置C/C++开发环境
解压放入自定义目录(英文路径)后,添加。到系统Path环境变量。安装C/C++插件。MinGW-W64 GCC最新版本, 选择。打开配置,设置编辑器路径和编辑模式。Vscode进行安装。
2023-04-24 19:11:30
309
原创 Esxi安装iStoreOS
设置静态ipv4地址和默认网关。之后要设置”使用自定义的 DNS 服务器“保证能通过域名对插件进行访问。在浏览器输入刚刚修改的ip地址,登陆iStoreOS的后台。密码:password。修改Lan的ip地址,保证与电脑在同一网段。可根据需要添加PCI设备,一般为网卡和硬盘。这里需要对硬件进行直通。下载镜像,本机选择x86_64_efi/,解压后得到img文件。,将img转化成vmware文件。对内存需要如下设置方可正常启动。
2023-02-19 12:34:25
6653
原创 Python安装
Anaconda会默认安装Jupyter Notebook,自行安装可。::: details (windows GPU版本)安装指南。中选择相应GPU版本和系统Python对应版本的安装文件,如。打开安装包,对于已经安装的版本,可以看到卸载的选项。Anaconda官方的源访问比较慢,可以设置成国内的。::: details (windows)安装指南。目录下,在如下目录中运行查看,Pass即为成功。安装之后,将相应的文件路径添加到环境变量。选择最新版本的torchvision,如。,然后添加工程的路径。
2023-01-13 08:27:34
614
原创 Git的使用
分成本地文件(working area)、暂存区文件(staging area)、远端仓库文件(remote)框框中的内容可以是:Commits、Blob(files)、tree(directories)、tags。对于如上的分支结构,只需要将Master的指针指向Branch即可。Mac/Linux:只需要上传时去掉编辑器所带的。,为了让文件能在两个系统兼容,需要设置如下。对于如上的分支结构,会先创建一个。,而Mac和Linux为。还未merge的分支查询。文件夹下的内容后,使用。,同步到本地需要添加。
2023-01-12 19:35:36
179
原创 C++11线程库
C++11封装了操作系统的线程接口函数,这样代码就兼容了不同的操作系统。2. 线程互斥一段代码:3. 线程同步三个线程依次打印:
2022-07-06 11:52:57
315
1
原创 Linux网络套接字
发送和接收本质是读取和写入发送和接收缓冲区,使用和也能达到类似的效果。由于从网络到主机的数据存在大端小端、字符字节长度等数据格式的问题,需要将数据转化为特定的格式。这个过程可以更具当前的系统自己实现,当然也可以调用系统提供的函数接口。网络上的数据传输一般是大端模式(即数据低字节存在内存高地址),数据的发送从内存的低地址到高地址,这样在发送的时候会先发数据的高位字节(报头),这样接受端可以快速判断数据的正负和大小。主机字节序和网络字节序的转换1.5 tcp相关函数接口由于tcp在数据传输前需要建立
2022-07-02 13:28:12
830
原创 MySQL入门基础
备份数据还原2. 数据表操作No.操作名称mysql>运行指令释义补充1创建表单create table if not exists person (name char(8),height int );[character set utf8 engine InnoDB];person为表的名称;在目录下创建表结构文件(person.frm)和数据索引文件(person.ibd)[指定编码格式和引擎]2[查看]表单信息desc person;3插入数据
2022-06-28 19:31:10
216
原创 C++11右值引用和移动构造
补充:2. 移动构造和移动赋值出了作用域对象还在,则可以使用左值引用返回;若出作用域后对象不在了,则不能用左值引用返回(对临时对象{一般在上层调用函数的栈或寄存器中}的引用会造成非法空间的访问),只能传值返回,但是当传值有深拷贝时会加大内存和计算的开销——解决方法:增加移动构造。当函数需要返回一个对象的时候(返回对象是一个右值),会优先调用对象的移动构造。临时对象维护一块堆上的空间,当临时对象析构后堆上的空间也要释放,移动构造保证了临时对象释放前,将资源交换给新的对象,避免了堆空间的重复申请和释放。
2022-06-25 00:52:22
330
原创 C/C++封装排序算法
直接插入排序\希尔排序\ \简单选择排序\堆排序\ 冒泡排序\快速排序\归并排序___动图演示和源码分享,一起学习!C++模板封装、多种实现快排的方法,呕心之作,箱说全。
2022-06-16 00:09:58
493
原创 C/C++堆
对于一棵二叉树,当每个节点都大于等于它的两个子节点时,称为堆有序,这样的堆称为大堆;而当每个节点都小于等于它的两个子节点时,称为小堆。堆可以用一个数组表示:思路:每次插入一个数,就对数组作调整。[8, 15, 11, 48, 7, 24, 2, 19, 21, 47, 45, 5, 25, 38, 23]2.2 测试程序结果显示:思路:将最后一个元素和堆顶元素交换,然后调整顺序。以下用表示堆顶元素3.2 测试程序结果显示:......
2022-06-15 20:12:17
214
原创 c++利用红黑树实现map和set
1.2 定义迭代器1.3 红黑树改写2. map和set的封装2.1 map.h2.2 set.h3. 测试程序结果展示:
2022-06-11 17:45:33
189
原创 C++多态
静态的多态:编译时实现。如template 定义的模板函数传入不同的变量,编译时处理成不同的函数,然后根据传入变量的类型进行调用,这是由函数重载实现的。静态的多态有:函数重载、重定义、运算符重载。动态的多态:运行时实现。假设父类有许多派生类,那么对于父类和派生类中的某个function可以有多种实现方式。在外部调用时,可以设计一个函数,当传递入不同的对象可以调用不同类中的function。这种通过父类的指针或引用保存子类空间的地址,在运行时传递不同的对象时调用不同的函数的方式称为多态。实现动态的多态通过虚函
2022-06-08 17:42:58
154
原创 C++继承
运行结果:3. 继承的默认成员函数构造和析构:拷贝构造和赋值运算符重载:以下情况需要自子类自己写构造、析构、拷贝、赋值重载:运行结果:4. 继承的切片对于公有(public)继承的类,派生类对象可以给基类对象赋值(基类 = 派生类,为了叙述方便可以定义成父 = 子),这种赋值方式称为切片(实际上是将子类中含有父类的成员变量赋值给父类对象);但是基类无法给派生类对象赋值(使用指针或引用可以强制操作,但是通过父类对象访问子类自定义的成员变量时会越界)。对于protected 和 private的
2022-06-06 23:49:20
173
原创 SystemV 共享内存
通过系统调用,将多个进程地址空间的部分区域映射到同一份物理内存,从而形成共享内存。共享内存具有最大的通信速度和便利性,因为它可以在计算机中以内存传输速度完成通信。然而,共享内存在多进程访问的同步和互斥方面存在问题,需程序员自行保证数据安全。进程运行结束,系统创建的IPC资源并不会释放,它的生命周期由内核决定。可以通过以下命令查看并手动释放:SystemV 共享内存的系统调用:size:系统给共享内存分配的大小实际是(4Kb)的整数倍。shmflg: :存在则获取,不存在则创建一块新的内存区域; :
2022-06-06 12:21:52
283
原创 Linux进程间通信(文件方式)
父进程和子进程在通信开始前要先关闭管道的未使用端,以确保从管道中读取的进程可以在写入程序关闭管道时检测到文件的结尾(返回0)。一旦进程完成通信并终止,普通管道就不再存在——只要该缓冲区中的数据不向磁盘刷新,数据就存在于进程的生命周期。管道的生命周期进程的生命周期。Linux中可以使用创建一个匿名管道:运行结果通过修改以上代码父子进程的读写时间,可以得出以下结论:管道是面向字节流的单向通信信道,管道里只要缓冲区没满,就可以一直写入。写端不写入或者写的速度小于读取的速度,读端会阻塞等待实际写入时,
2022-06-05 18:12:03
611
原创 Linux动静态库
Windows中的动态库文件以为后缀名、静态库以为后缀;而Linux动态库文件后缀为 、静态库为库的真名:去掉前缀,去掉 \ 后缀,剩下的就是库名。例如,库的真名就是查看可执行程序包含的动态库。动态库系统中默认包含,因为许多shell程序都依赖动态库运行。程序在链接时默认使用动态库。若将源文件以静态()的方式链接,则会产生一个静态的可执行文件;使用静态链接需要安装相依赖的静态库。2. 动静态库的制作和使用2.1 源文件直接使用,不生成库运行结果:2.2 生成静态库2.2.1 静态库
2022-06-04 13:31:51
760
原创 Linux的EXT文件系统
Super Block:包含了 整个分区有多少组、使用情况等信息;Group Descriptor: 整个分组的使用情况;Block Bitmap:位图,可以快速查找数据块的使用情况,并为新的节点分配相应的数据块;有数据相应的位为1;inode Bitmap : 位图,可以快速查找inode编号的使用情况,每个bit位代表一个inode编号 ; 每个位是1或0,代表对应的inode是否被占用;inode Table : 存储文件属性相关的结构体数据,包含文件名、权限、inode和数据块的映射关系等Data
2022-06-03 20:46:52
322
原创 Linux中的文件操作
所有输入/输出设备(如网络、磁盘和终端)都表现为文件,所有输入和输出都是通过读取和写入适当的文件来执行的。这种从硬件设备到文件的映射接口称为I/O,它使所有输入和输出都能够以统一的方式执行。应用程序通过请求内核打开相应的文件,内核返回一个非负整数,称为描述符,用于在文件的所有后续操作中标识该文件。操作系统从文件中将数据加载到内存是通过一个batch(n个字节构成),目的是可以以一种统一的方式读写。当读取时,超过了文件中的batch数,则会返回(它并不代表文件的真实结尾,真实的字符数会小于读取的字符;文件末尾
2022-06-03 01:46:04
241
原创 Linux进程替换——进程执行其它代码的方式
程序是代码和数据的集合;程序可以作为对象模块存在于磁盘上,也可以作为地址空间中的段存在。进程是正在执行的程序的特定实例;程序总是在某个进程的上下文中运行。进程替换函数在当前进程的上下文中加载并运行新程序。虽然它会覆盖当前进程的地址空间,但不会创建新进程。新程序仍然具有相同的PID,并且它继承了调用进程替换函数时打开的所有文件描述符。进程替换函数有如下几个:其中各个函数的名称可以按包含的字母解剖为:具体例子:下面给个关于的具体的实操:
2022-06-01 01:56:52
167
原创 Linux进程
Linux进程1. 进程的几个概念2. fork创建子进程3. 地址空间4. 进程的退出4.1 基本概念4.2 父进程等待子进程退出4.2.1 waitpid4.2.2 退出状态status5. 其他5.1 获取环境变量5.2 孤儿进程1. 进程的几个概念每个进程执行其逻辑流的一部分,然后在其他进程轮流执行时被抢占(暂时挂起)。进程与其他进程轮流执行的过程称为多任务处理。进程执行其流的一部分的每个时间段称为时间片。因此,多任务也被称为时间切片。任何逻辑流在时间上与另一个流重叠的进程都称为并发进程,这
2022-05-31 18:09:05
128
原创 Linux入门基本命令
Linux基本操作1. 基本常识1.1 命令行中的快捷键2. 常用命令2.1 查看命令2.2.1 文件函数查看2.2.2 系统进程查看2.2 用户及权限管理2.3 常用操作命令2.4 bash标准输入2.5 bash标准输出3. 其他3.1 环境变量1. 基本常识$:普通用户#:超级用户root~:用户家目录/:系统根目录1.1 命令行中的快捷键Ctrl + a : 定位行首Ctrl + e : 定位行尾Ctrl + f : 光标向前移动Ctrl + b : 定位向后移动Ctrl
2022-05-29 17:10:38
279
原创 二叉树遍历_递归和迭代(动图)
二叉树遍历_递归和迭代1. 定义二叉树2. 二叉树递归遍历3. 二叉树迭代遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历3.4 层序遍历1. 定义二叉树 首先定义一个简单的二叉树,以供测试:template<class T>struct BinaryNode{ BinaryNode<T>* _left; BinaryNode<T>* _right; T _val; BinaryNode(const T& val = T()) :_l
2022-05-26 23:53:34
479
原创 作图神器Graphviz——学习数据结构的好帮手
Graphviz1. 基本语法补充2. 编译运行3. 一些例子3.1 一个简单的二叉树 官网下载好对应系统的版本并安装 ,在terminal中输入dot -version可以检查安装是否成功。若未出现相应的版本信息,可以考虑配置环境变量或者重新安装。1. 基本语法 和C语言一样,Graphviz也有一些关键字,不能作为自定义变量,以下是几个基本的关键字:graph:定义无向图,描述为a--bdigraph:定义有向图,描述为a->bsubgraph:定义子图,子图可以单独用框框出st
2022-05-26 01:15:53
1990
3
原创 Posix信号量
Posix信号量信号量s是一个具有非负整数值的全局变量,只有两个特殊的操作,称为P和V:P和V的名字来自荷兰语Proberen(测试)和Verhogen(增量)。P操作等待信号量s变为非零,然后将其递减。V操作增加s。信号量与每个共享资源相关联,记录了共享资源的个数。PV操作保证了线程的同步和互斥,这样多线程进行获取及并发执行的时候可以避免不安全的访问。P (s): while (s <= 0); s–;V (s): s++;为了保证信号量的大小是有限的,并且在条件重新满足后线程可以重复访
2022-05-21 17:29:43
274
原创 多线程之同步与互斥
多线程1.线程的基本概念2.线程的互斥和同步2.1 基本概念2.2 互斥的实现2.3 同步的实现补充:生产消费者模型参考资料1.线程的基本概念 多线程可以将计算密集型(实时)和I/O密集型(实际中会等待)应用分配到多个处理器上执行,提高执行效率,但是会增加调度成本。 Linux没有专门的TCB(Thread Control Block),而是复用了进程的PCB;不同的PCB指向同一个地址空间,并将地址空间的数据段和代码段进行划分分配给不同的PCB。 进程是资源分配的基本单位,线程是运算调度的基
2022-05-18 13:14:32
2091
原创 AVL(平衡二叉树)
平衡二叉树 在二叉搜索树的基础上引入平衡因子BF(balance factor)= 右子树高度 - 左子树高度,防止出现单链接太长的情况。平衡因子的更新规则:若新增的节点在parent右边,parent->BF++;若新增的节点在parent左边,parent->BF- -;若parent的平衡因子等于1 or -1,继续往上更新若parent的平衡因子等于0,停止更新若parent的平衡因子等于2 或者 -2,开始旋转AVL的旋转考虑四种情况:右单旋:代码:
2022-05-07 00:06:30
605
原创 Linux信号
Linux信号1.信号的产生2.信号的存储与执行参考资料 使用 kill -l 可查看所有的信号,其中1- 31是普通信号(对于两个以上的相同信号会丢失,因为只有一位位图保存);34 - 64是实时信号(用链表队列形式将实时信号进行保存,可以保存多份)。NumberNameDefault actionCorresponding event1SIGHUPterminate终端线挂起2SIGINTterminate来自键盘的中断(Ctrl + c)3SI
2022-05-05 15:46:02
1472
原创 条件与循环中的细节
条件与循环中的细节1 条件语句switch case的细节2 循环语句2.1 while和for中的continue2.2 关于for语句2.3 goto的使用技巧1 条件语句switch case的细节❄ switch() 中的内容必须是整形变量或整型表达式,而case 后接整形常量或整形表达式❄ case中如果不加break,则程序从case入口一直运行到switch结束,否则遇到break停止。❄ switch()允许套用使用❄ 注意使用default一段代码进行解释#inclu
2021-11-02 00:03:01
109
原创 操作符详解
操作符的优先级1.优先级列表2. 注释1.优先级列表 下标列出了C 运算符的优先级和结合性。运算符优先等级按降序从上到下列出。 优先级 操作符 描述 结合性 1 ++ -- Suffix/postfix(后缀)递增和递减 左到右 () 函数调用 [] 数组下标 . 结构和联合成员访问 -> 通过
2021-10-17 16:21:59
257
原创 C语言中的常量和变量(二)之一文读懂float
C语言中的常量和变量(二)1. 前言2. 公式表达2. 空间存储3. 代码验证1. 前言 C语言中关于变量的初始化、变量的改变和变量的其它一些操作将会结合操作符进行说明。另外变量的读写(printf和scanf)仍有一些细节要掌握,这将在之后的文章中说明。这里单独来说一说float这个类型的变量,并对隐式类型转换作一些补充。首先我们来回顾一下隐式类型转换的规则:2. 公式表达 float类型变量在计算机中的存储不像int类型那样易于理解,而是遵循着一个特别的协议:《IEEE Standar
2021-10-17 01:11:45
926
原创 操作符的细节(!~)
!和~相同点:都不会改名变量原来的值。!和~的区别:!表示逻辑非,~表示二进制(补码)按位取反,取反包含符号位 。另外~只能对整数进行操作,而!可以对浮点数进行操作。!对浮点数进行操作时,即对于非零的浮点数取逻辑非,用%d进行打印结果是0,用%f进行打印结果是0.000000(由int -> float的转变),这个结果在while循环中被认为是假,一段代码为证:另外要明确两点:在C语言中,0为假,非0为真。在VS2015中,默认的真为1,假为0,由以下代码可以看到对非1的真数两次取逻辑反
2021-10-16 15:03:39
1188
原创 隐式类型转换(Type Conversion)
隐式类型转换(Type Conversion)1. 物理结构2. 代码剖析3. 规则引入3.1 变量类型的转换3.2 变量数值的转换4. 其他1. 物理结构 了解变量的隐式类型转换对变量存储的理解有极大的帮助。 首先要说明的是,为什么C语言在编译时会存在Type Conversion这个bug(我之所以称其为bug,是因为如果我们忽略了它的存在,我们所存储的数据也许就不是我们所需要的,造成一系列的连锁反应和不可预知的结果)。 计算机在执行两个数的算术运算时,操作数通常必须具有相同的大小(相同的
2021-10-15 20:26:30
750
原创 C语言中的常量和变量(一)
C语言中的常量和变量(一)1. C语言中的常量2. C语言中的变量1. C语言中的常量常量的分类666666 //数字常量const int a //const修饰的变量#define a 1 //宏定义常量,相当与把a替换为(数字常量)1enum //枚举常量常量不可以被修改,故const修饰的常变量在定义时需要被初始化。2. C语言中的变量2.1 一点回顾 C语言中,1个bit对应于二进制中的1位(0或1),在实际的电路中可以代表高低电平。由于0和1的差别
2021-10-11 23:55:28
276
原创 Visual Studio 2015 C语言 新建、运行、调试
1、新建一个空项目2、添加C语言文件写一段程序:#include <stdio.h>int main(){ int i = 10; for (; i > 0; i--) { printf("hello world\n"); } return 0;}tip:左栏解决方案管理器,可按下图打开:3、运行代码 Ctrl + F5tip:当程序运行后,没有显示控制台输出,可以如下设置:或者可...
2021-10-08 23:29:44
2154
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人