Linux编程c/c++程序
前言
我们Windows系统下的idea可以说是非常智能了,集成了各种开发工具,包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中,每个组件之间是相互独立的,每个组件各司其职,共同协作完成整个程序从编译编辑调试再到运行的整个过程。Linux中我们编辑器选择vim编辑器,编译器选择gcc/g++编译器,调试器选择gdb/cgdb,自动化构建工具选择makefile,版本控制工具选择git。可以说以上几个组件会贯穿我们整个编程的流程,熟练掌握以上组件的使用可以加速我们的开发。今天我们就以一个简单的HelloWorld程序的开发为大家介绍一下这几个组件的基础使用
vim编辑器
vim编辑器简单来说就是一个可以拓展功能的“记事本”。vim是一款多模式的编辑器,模式间可以自由切换,每个模式分别对应一下功能
多模式
日常开发我们主要介绍三种模式外加简单介绍几种拓展模式的核心功能
三种核心模式:插入模式,底行模式和命令模式
命令模式
进入vim默认是这个模式,任何模式下按Esc会退回至命令模式。
该模式下主要使用命令操作,我们介绍一下在命令模式下常见的命令有哪些
i进入插入模式,光标位于当前位置;a进入插入模式,光标位于下一个位置;o进入插入模式,当前行下新建一行,光标位于新建行行首
hjkl分别可以控制光标的移动 ,j向下,k向上,h向左,l向右。新版的vim编辑器适配小键盘方向键的上下左右
G光标移动到尾行 gg光标移动到首行 $光标移动到当前行行尾 ^光标移动到当前行行首
w光标移动到下一个单词开头处 e光标移动到下一个单词结尾处 b光标移动到上一个单词开头处
#l光标移动到#行 #G可以跳转至指定行
翻页的命令也有,笔者不常用,这里不再展开
x删除光标所在位置的字符 #x删除包括光标所在位置往后#个字符
X删除光标所在位置前面的字符 #X删除光标所在位置前面的#ge字符
dd删除光标当前行 #dd删除包含光标后的#行
yw复制光标当前位置到词尾 #yw 复制光标所在位置开始后的n个词
yy复制当前行 #yy复制n行包含光标所在行
p粘贴复制内容到光标位置
r替换光标所在的字符 R会进入替换模式输入就会替换原先的字符,知道Esc退出替换模式
u撤销,多次u可以撤销多次操作 ;Ctrl r 恢复 可以恢复多次 互为逆操作
插入模式
前面我们介绍了,i进入插入模式就可以正常编辑,Esc退出至命令模式
底行模式
在命令模式下打 ‘:’ ,会在vim编辑器底行出现 ‘:’, 此时就进入底行模式,Esc退出至命令模式
进入底行模式也可以使用指令
‘:set nu ’每行前显示行号
‘:# ’跳转至#行
‘:w’保存, ‘:q’退出 ,可以一起使用
‘:!’强制操作 例如强制保存 ‘:!w’
直接输入 ‘/key’ 寻找key关键字出现的位置 ‘?key’ 寻找key关键字出现的位置。n可以定位到下一个位置,‘/’向下查找‘?’像上查找
补充
在我们想批量操作时,可以 Ctrl v进入视图模式,上下左右键圈定操作范围,d可以批量直接删除
选择范围I可以进入插入模式,在圈定范围的第一行输入你想输入的内容可以是注释,2下Esc可以让圈定的每一行执行一样的操作
以上操作在批量注释和取消注释时比较好用
vim编辑器配置
vim是一款可配置的编辑器,在/etc/vim目录下有个名为vimrc的文件,这个文件可以配置全局的设置。在每个用户的家目录下有个.vimrc可以配置每个用户个性化的配置。网络上关于vim的配置有很多,还有一些自动补全的插件。我们只是简单提一下,这不是我们今天的重点
gcc/g++编译器
在之前我们介绍了vim编辑器,我们可以完成c/c++代码的书写。接下来就是代码的编译阶段,我们介绍gcc/g++编译器的简单使用。下面我们使用gcc举例,g++使用类似
编译的过程可以分为预处理,编译,汇编,连接
gcc编译器的指令是 gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]
预处理
宏替换,删除注释,条件编译,头文件展开等等
处理 # 号开头的代码
gcc –E hello.c –o hello.i
-E 代表将源文件编译到预处理结束后
-o 代表处理完成之后将结果写入指定的文件 预处理结束后的文件后缀是.i
编译
检查代码的正确性(词法分析、语法分析、语义分析),对代码进行优化生成汇编等
gcc –S hello.i –o hello.s
-S 代码处理到编译后结束
-o同上 编译后的汇编代码文件后缀是.s
汇编
生成机器码
gcc –c hello.s –o hello.o
-c 代码处理到汇编后结束
-o同上 这时文件中全是二进制的机器码,文件后缀是.o
连接
生成可执行文件或者库文件
gcc hello.o –o hello
-o同上 此时得到的就是可执行文件 多个.o文件连接则在hello.o后面一一列举
以上整个过程可以使用gcc hello.c –o hello一步到位
动静态库
库是一整套的解决方案,例如libc是c语言的一套解决方案,它提供了编程C语言最基础的功能,让我们可以更快的二次开发
库的分类可以分为静态库和动态库,他们本质上是一样的只不过支持不同的编译方式——静态链接和动态链接
动静态链接
简单来说,静态链接就是将代码中使用到库的代码的函数实现拷贝一份到源文件中,静态链接编译完成后不依赖库但是体积大,内存中可能出现大量重复代码
动态链接完成后依赖库文件。在第一次加载动态链接的程序时会将库一起加载到内存中,后续执行库函数会跳转至库中执行完成后返回。对库依赖度大,体积小,共享库函数的代码
在编译是默认使用的是动态链接,需要使用静态链接时需要指定参数-static
makefile自动化构建工具
什么是makefile
在前面我们学习了如何编辑编译代码,我们一般喜欢将代码先全部编译为.o文件,最后将所有.o文件链接形成库或者可执行文件。随着工程量激增,编译.o这样的重复的工作量激增,我们迫切需要一种自动化构建的工具,makefile就是为了解决这个问题产生的。
makefile是一个文件,提前声明了各种规则,我们可以使用make命令调用这些规则,达到一键化编译的效果,当然了makefile也可以实现其他一键化的功能
makefile文件必须在工作目录里,文件名为makefile或者Makefile
基础版
我们先写一个最基础的makefile版本
code:code.cgcc -o code code.c
第一行 code指的是你需要生成的文件的文件名,code.c是你构建code时依赖的文件
第二行 必须以tap键开头,包含一个命令,这个命令规定了如何使用依赖文件生成目标文件
保存退出,在命令行中使用make命令就可以一键编译
make clean 和.PHONY
我们可以再写一个一键化清理可执行程序的makefile
code:code.cgcc -o code code.c
.PHONY:clean
clean:rm -f code
.PHONY可以理解为makefile的一种修饰符,修饰的是伪目标,相比于不修饰的区别就是,修饰后总是被执行。‘:’后面跟随伪目标的目标名
clean和code一样都是文件名,但clean是伪目标,修饰后总是被执行。冒号后面跟依赖的文件,为空就不写
第二行依然是tap键开头,写对应规则的命令
注意,makefile文件默认从上向下扫描文件。make默认形成第一个目标文件,形成后面的目标文件需要“make 文件名”。.PHONY修饰的总是被执行,那什么时候不会被执行呢?满足两个条件,没用被.PHONY修饰并且依赖文件未更新。这个依赖文件是否更新可以查看依赖文件的时间属性
makefile调用链
code:code.ogcc -o code code.o
code.o:code.sgcc -c code.o code.s
code.s:code.igcc -S code.s code.i
code.i:code.cgcc -E code.i code.c
如上的代码在我们工作目录下只有code.c的情况下依然可以编译通过,这得益于makefile会自动处理调用链,以上只是示例代码,我们工程中一般不这样写
makefile定义变量
BIN=code
CC=gcc
LFLAGS=-o
RM=rm -f
SRC=code.c$(BIN):$(SRC)$(CC) $(LFLAGS) $(BIN) $(SRC)
.PHONY:clean
clean:$(RM) $(BIN)
@符号设置不回显命令
BIN=code
CC=gcc
LFLAGS=-o
RM=rm -f
SRC=code.c$(BIN):$(SRC)@$(CC) $(LFLAGS) $(BIN) $(SRC)
.PHONY:clean
clean:@$(RM) $(BIN)
$@表示生成的目标文件 $^表示依赖文件
BIN=code
CC=gcc
LFLAGS=-o
RM=rm -f
SRC=code.c$(BIN):$(SRC)@$(CC) $(LFLAGS) $@ $^
.PHONY:clean
clean:@$(RM) $(BIN)
命令式可以多行的,每行以tap开头
自动化Makefile
我们前面说过我们喜欢将源文件先编译为.o文件,再将所有.o文件链接形成库或者可执行文件
我们也可以通过一些命令 收集工作目录下.c 或者.o文件
BIN=code
CC=gcc
LFLAGS=-o
FLAGS=-c
RM=rm -f
#SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名
OBJ=$(SRC:.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表$(BIN):$(OBJ)$(CC) $(LFLAGS) $@ $^%.o:%.c$(CC) $(FLAGS) $< #将所有.c文件编译形成同名.o $<是将.c文件依次展开.PHONY:clean
clean:$(RM) $(BIN) $(OBJ)
git版本控制工具
在开发过程中,版本控制是一件很重要的事情是,git是常用的版本控制工具,gitee是国内较大的远程代码托管平台,它是基于git实现的
git的历史和gitee的注册,创建仓库的操作我们就不再展开了。我们学习一下git的简单使用和命令
git仓库可以分为工作区,本地仓库和远程仓库
工作区顾名思义就是我们工作目录,它里面的代码没用被管理
工作区的文件可以提交到本地仓库,本地仓库可以实现文件管理和版本控制
本地仓库可以推送到远程仓库,也可以从远程仓库拉取新的文件
git clone git地址 就可以克隆远端仓库到本地
仓库拉去下来会有些隐藏文件 .git是本地仓库 .gitignore是git忽略文件的规则
这时我们的工作目录变成了工作区,我们可以使用‘git add .’ 会将工作区的所有陌生文件添加到本地仓库中,此时这个文件还在本地仓库的暂存区,未被严格意义上被git管理版本
git commit -m "版本信息" 这个命令会将暂存区的文件全部提交为一个新的版本,可以跟随这个版本的信息一起提交
git log 可以显示历代版本的版本信息和版本ID,这个ID可以支持版本的回退。但这不是我们今天的重点,我们不再展开
git push 可以将本地仓库推送到远程仓库,本质就是一次同步的过程,同步的过程可能会出现冲突,冲突需要处理,但这不是我们今天的重点,我们不再展开
第一次提交时可能需要你提供身份信息,提供后就可以正常提交
这里我们简单了解一下,学会基础的使用即可,感兴趣的朋友可以自行查阅相关资料
gdb/cgdb调试器
我们的代码可以编写编译一键化构建也可以进行版本控制,我们还需要学习代码的调试。可以说程序员绝大多数时间都在调试代码上,学会如何调试代码也显得格外重要,这能帮助我们尽快的锁定问题解决问题
在前面我们介绍的gcc编译选项默认是release模式,这种模式下的可执行程序效率更高但是无法调试,需要生成调试的可执行文件需要使用 "-g"选项
接下来我们就可以使用jdb启动调试程序
gdb 可执行文件名 就可以进入jdb的调试 quit可以退出调试
我们可以使用list 简写l 将调试的代码都打印出来
也可以 'l 文件名:'行号 从指定文件的指定行开始打印 ‘l 函数名’可以打印指定函数的内容
b 行号 就可以在指定行号中打断点
r就可以开始运行程序,会在断点处停止
c可以将代码直接全部执行完成
这是gdb的简单使用,但是gdb没用友好的操作界面,我们推荐使用cgdb,这个程序和gdb的指令完全相同但是页面更加友好
下载完成cgdb后 使用 ‘cgdb 被调试文件名‘ 启动调试 前面介绍的指令在cgdb中也是完全可以使用的
我们在cgdb中打断点 可以 ‘b 文件名;函数 ’ ‘b 函数 ’ ‘b 行号 ’
可以使用 info b 查看断点信息
断点编号 断点类型 忽略 启用 地址 位置
我们可以使用 d 断点编号 删除指定的断点
delete/d breakpoints 删除所有断点
n/next逐过程调试 s/step逐语句调试 再调试过程r可以重启调试
bt可以查看函数调用信息
finish 执行完当前函数并返回后停止
p 变量名/表达式 可以打印指定变量/表达式的值
disable 断点编号 可以使指定的断点失效
enable 断点名 可以恢复失效的断点
c可以运行到下一个断点处
until 行号 可以将代码运行到指定行号
display 变量名 可以在每次停顿的时候打印变量 打印时会显示变量的编号
undisplay 变量编号 可以取消每次停顿时打印变量值
info locals 查看当前函数的所有变量和变量值
watch 变量名 可以在每次变量值变化时通知
set var 变量名=值 可以修改变量的值
b 行号 if 表达式 #表⽰指定行号新增断点并设置条件触发 表达式为真触发
condition 断点编号 表达式 #表⽰为存在的断点设置条件触发 表达式为真触发
换车行默认执行的是上一条指令
结语
我们简单的介绍了一个代码从编写编译一键化构建到调试和版本控制的全过程,几乎涵盖了全部的开发流程,可以帮助读者们在Linux上编写自己的代码
以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。
因为这对我很重要。
编程世界的小比特,希望与大家一起无限进步。
感谢阅读!
相关文章:
Linux编程c/c++程序
前言 我们Windows系统下的idea可以说是非常智能了,集成了各种开发工具,包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中,每个组件之间是相互独立的,每个组件各司其职,共同协作完成…...
【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...
redis单机安装
redis单机安装 下载地址 官网:https://redis.io/下载列表页面:https://download.redis.io/releases/ 说明 版本选择:redis-7.0.0.tar.gz下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz 安装前准备 在linu…...
从零手写RPC-version0
参考文档 https://github.com/he2121/MyRPCFromZero Version-0 0、写项目第一步,先添加远程仓库 先在 github 上新建仓库,然后将本地新建的项目推送到远程仓库中 由于网上很多教程,所以本节不再赘述(可以让 chatGPT给出一个完…...
MOM成功实施分享(八)汽车活塞生产制造MOM建设方案(第二部分)
在制造业数字化转型的浪潮中,方案对活塞积极探索,通过实施一系列数字化举措,在生产管理、供应链协同、质量控制等多个方面取得显著成效,为行业提供了优秀范例。 1.转型背景与目标:活塞在数字化转型前面临诸多挑战&…...
二、Android Studio环境安装
一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…...
构件与中间件技术:概念、复用、分类及标准全解析
以下是对构件与中间件技术相关内容更详细的介绍: 一、构件与中间件技术的概念 1.构件技术 定义:构件是具有特定功能、可独立部署和替换的软件模块,它遵循一定的规范和接口标准,能够在不同的软件系统中被复用。构件技术就是以构…...
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者,奋战了2天,借助AI开发一款FLASK小工具,功能还在完善中(时间轴可以跟随关联图缩放,加了一个用C键控制…...
CSS 字体学习笔记
在网页设计中,字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性,用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列(font-family) 1. 字体系列的分类 在 CSS 中…...
通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发
AI写标书及知识库构建详细设计方案 一、系统架构设计 +-------------------+ +-------------------+ +-------------------+ | 用户交互层 | | AI服务层 | | 知识库存储层 | | (Web/API) |---->| (Spring AI) |---…...
cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。
目录 为什么会有这边文章 辛酸历程,不看也罢 想解决问题,看这里就够了 问题已解决,后边还是废话 为什么会有这边文章 最近,做一个项目需要用在前端实现图片裁剪功能,毋庸置疑,cropperjs是不二选择。当在…...
2、JSX:魔法世界的通行证——用魔法符号编织动态界面
一、开篇:魔法符号的觉醒 "看呐,赫敏!这根魔杖(React组件)为何能自动绘制出动态界面?"年轻的巫师学徒罗恩指着闪烁的屏幕惊呼。 "这就是JSX魔法阵的威力,"邓布利多校长挥舞…...
八大排序算法
目录 八大排序算法排序算法的稳定性比较排序插入排序直接插入排序希尔排序希尔排序的时间复杂度计算 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序递归hoare版本挖坑法lomuto前后指针 非递归 归并排序排序性能对比 非比较排序计数排序 比较排序算法总结 八大排序算法 …...
搭建一个Spring Boot聚合项目
1. 创建父项目 打开IntelliJ IDEA,选择 New Project。 在创建向导中选择 Maven,确保选中 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息: GroupId:com.exampl…...
Google A2A协议解析:构建分布式异构多Agent系统
一、A2A 是什么?有什么用? 1.1 A2A 是什么? A2A(Agent-to-Agent Protocol)是Google最新推出的一项开源协议,旨在为AI智能体(Agents)提供标准化的通信方式。它允许不同框架…...
【Android读书笔记】读书笔记记录
文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop,极端条件下直接调用onResume 当用户打开新…...
支持selenium的chrome driver更新到135.0.7049.84
最近chrome释放新版本:135.0.7049.84 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...
【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发
文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码,直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作࿰…...
利用阿里云企业邮箱服务实现Python群发邮件
目录 一、阿里云企业邮箱群发邮件全流程实现 1. 准备工作与环境配置 2. 收件人列表管理 3. 邮件内容构建 4. 附件添加实现 5. 邮件发送核心逻辑 二、开发过程中遇到的问题与解决方案 1. 附件发送失败问题 2. 中文文件名乱码问题 3. 企业邮箱认证失败 三、完整工作流…...
中文编码,GB系列,UTF
图片来源:https://zhuanlan.zhihu.com/p/701690894 文章目录 ASCIIGB系列编码UTF编码 ASCII American Standard Code for Information Interchange 一个字节,但其实只用了一半: 128个字符 GB系列编码 “国标” 和ASCII是兼容的。 GB2312…...
车载以太网-TLS
文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...
【大英赛】大英赛准备笔记
听力 总结 提醒专注 一题一个听力时,听是重点 抓紧时间往后审题 比较容易的部分:secA & secD中的dictation,在大致审当前的基础上,分别利用这个时间提前看后面的secB√& summery secA 听之前应当大致审选项&#x…...
有序数组的平方
暴力排序 每个数平方以后排个序 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int slow0,fast0;int nnums.size();while(fast<n){nums[slow]nums[fast]*nums[fast];fast;slow;}sort(nums.begin(),nums.end());return nums;} }…...
Python基于Django的房屋信息可视化及价格预测系统(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
【5G-A学习】ISAC通信感知一体化学习小记
通信感知一体化(Integrated Sensing and Communication, ISAC)是一种将无线通信与环境感知功能深度融合的技术,通过共享硬件、频谱和信号处理流程,实现通信与感知的协同增效。其核心原理及无人机与飞鸟的识别方式如下:…...
深入解析@Validated注解:Spring 验证机制的核心工具
一、注解出处与核心定位 1. 注解来源 • 所属框架:Validated 是 Spring Framework 提供的注解(org.springframework.validation.annotation 包下)。 • 核心定位: 作为 Spring 对 JSR-380(Bean Validation 2.0&#…...
学生考勤管理系统(jsp+ssh+mysql5.x)含文档
学生考勤管理系统(jspsshmysql5.x)含万字详细文档 学生考勤管理系统是一个用于管理学生出勤和请假的系统,系统登录页面提供账号和密码输入框,用户可以选择角色进行登录。系统主菜单包括班级管理、用户管理、课程表管理和考勤情况…...
【响应式编程】Reactor 常用操作符与使用指南
文章目录 一、创建操作符1. just —— 创建包含指定元素的流2. fromIterable —— 从集合创建 Flux3. empty —— 创建空的 Flux 或 Mono4. fromArray —— 从数组创建 Flux5. fromStream —— 从 Java 8 Stream 创建 Flux6. create —— 使用 FluxSink 手动发射元素7. generat…...
为什么我们需要if __name__ == __main__:
[目录] 0.前言 1.什么是 __name__? 2.if __name__ __main__: 的作用 3.为何Windows更需if __name__ ?前言 if __name__ __main__: 是 Python 中一个非常重要的惯用法,尤其在使用 multiprocessing 模块或编写可导入的模块时。它的作用是区分…...
Week 1: Time Complexity, Rectangle Geometry
问题集 Square PastureBucket BrigadeBlocked BillboardBlocked Billboard IIWord ProcessorDo You Know Your ABCs?The Cow-SignalD3C - White Sheet 视频解析 Square Pasture Bucket Brigade Blocked Billboard Blocked Billboard II Word Processor Do You Know Your AB…...
论文学习:《通过基于元学习的图变换探索冷启动场景下的药物-靶标相互作用预测》
原文标题:Exploring drug-target interaction prediction on cold-start scenarios via meta-learning-based graph transformer 原文链接:https://www.sciencedirect.com/science/article/pii/S1046202324002470 药物-靶点相互作用(DTI&…...
STM32 HAL库 OLED驱动实现
一、概述 1.1 OLED 显示屏简介 OLED(Organic Light - Emitting Diode)即有机发光二极管,与传统的 LCD 显示屏相比,OLED 具有自发光、视角广、响应速度快、对比度高、功耗低等优点。在嵌入式系统中,OLED 显示屏常被用…...
UE5蓝图之间的通信------接口
一、创建蓝图接口 二、双击创建的蓝图接口,添加函数,并重命名新函数。 三、在一个蓝图(如玩家角色蓝图)中实现接口,如下图: 步骤一:点击类设置 步骤二:在细节面板已经实现的接口中…...
封装Tcp Socket
封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...
深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作
在 Android 应用开发中,流畅的 UI 渲染是用户体验的核心。但你是否好奇,一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的?本文将从底层图形系统的视角,解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...
LeetCode每日一题4.13
1922. 统计好数字的数目 问题 问题分析 题目要求我们找到长度为 n 且满足特定条件(偶数下标处为偶数,奇数下标处为质数)的数字字符串的总数,并对 (10^9 7) 取余。 思路 1.枚举 生成所有可能的数字字符串:对于长度…...
Java学习——day29(并发控制高级工具与设计模式)
文章目录 1. 并发控制高级工具简介1.1 CountDownLatch1.2 CyclicBarrier1.3 Semaphore1.4 并发设计模式 2. 扩展生产者—消费者示例2.1 示例代码 3. 代码详解3.1 主类 ExtendedProducerConsumerDemo3.2 Buffer 类3.3 Producer 类3.4 Consumer 类 4. 编译与运行结果4.1 编译4.2 …...
使用FormData格式上传图片
为什么要使用FormData格式上传图片 1. 为什么使用 FormData? FormData 是一种专门用于构建表单数据的对象,它能够以 multipart/form-data 格式发送数据,这是文件上传的标准格式。以下是使用 FormData 的主要原因: 简单易用 直…...
Tkinter表格与列表框应用
在图形用户界面(GUI)开发中,表格和列表框是常用的控件,用于显示和管理大量的数据。Tkinter提供了Listbox控件来显示简单的列表数据,而对于更复杂的表格数据,可以使用Treeview控件(属于ttk模块)来实现。这一章将介绍如何使用Listbox和Treeview来显示和操作数据,帮助您处…...
【Excel】数据透视表月度数据排序不正确
【问题】 插入数据透视表后,月度列显示的日期,是按照文本格式排序的,显然与实际月份排序并不相符。 【目的】 按照从1月份到12月份进行自然月度排序。 【方法】 步骤一: 在任意一处,输入“1月”-“12月”&#…...
HCIP第十天
OSPF的数据包 OSPF是跨层封装协议,直接封装在网络层之上 --- 需要IP协议使用一个协议号来标定 OSPF --- 89 OSPF的头部 版本 --- OSPF的版本 --- 2 类型 --- OSPF数据包的类型 --- hello -- 1 DBD -- 2 LSR -- 3 LSU -- 4 LSACK -- 5 路由器ID --- RID --- 携带的是发出O…...
Vue2,Vue3知识大全
Vue 1.了解vue,快速上手 vue是一个用于构建用户的界面的渐进式框架. vue的两种使用方法: vue核心包开发 场景:局部模块改造 vue核心包&vue插件 工程化开发 场景:整站开发 1.创建一个vue实例: 2.插值表达式 1.插值表达式是一种Vue的模版语法 作用:利用表达式进行插值…...
java面向对象02:回顾方法
回顾方法及加深 定义方法 修饰符 返回类型 break:跳出switch和return的区别 方法名 参数列表 package com.oop.demo01;//Demo01类 public class Demo01 {//main方法public static void main(String[] args) {}/*修饰符 返回值类型 方法名(...){//方法体return…...
【Ubuntu】【树莓派】Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和文件传输操作
目录 一、Ubuntu远程终端并实现文件上传下载 1.1Ubuntu桥接模式设置和新用户的创建 1.2Ubuntu的远程登录并上传和下载文件 1.3在Xming中进行Ubuntu的图形访问 二、树莓派远程登录并实现文件上传下载 2.1树莓派在putty上的远程登录 2.2使用ftp远程登录并实现文件上传下载…...
Linux Kernel 2
地址空间(Address Space) 一、物理地址空间(Physical Address Space) 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例:在典型的 32 32 32 位 Intel 架构中, RAM(…...
二.springBoot项目集成ElasticSearch及使用
二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰,用rest-high-level-client代替--> <dependency><groupId>org.elasticse…...
从三次方程到复平面:复数概念的奇妙演进(一)
注:本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第一篇。 生料,不同的文章不同的点。 机翻,未校。 Reflections on the History of Complex Numbers 复数的历史回顾 The first occurrence o…...
Day52 | 6. Z 字形变换、8. 字符串转换整数 (atoi)、22. 括号生成、38. 外观数列
6. Z 字形变换 题目链接:6. Z 字形变换 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {public String convert(String s, int numRows) {if(numRows<2) return s;List<StringBuilder> rowsnew A…...
每日OJ_牛客_ruby和薯条_排序+二分/滑动窗口_C++_Java
目录 ruby和薯条_排序二分/滑动窗口 题目解析 C代码 Java代码 ruby和薯条_排序二分/滑动窗口 ruby和薯条 描述: ruby很喜欢吃薯条。 有一天,她拿出了n根薯条。第i根薯条的长度为ai。 ruby认为,若两根薯条的长度之差在l和r之间ÿ…...
快速幂运算
快速幂运算 一、快速幂运算快速幂运算(Exponentiation by Squaring)基本思想算法实现(②③为非递归)① 递归运算② 普通 除模运算(不带 **模数** 与 带 **模数**)③ 按位与运算 使用示例示例代码 复杂度分析…...