- 博客(268)
- 资源 (1)
- 收藏
- 关注
原创 Git基本操作快速入门(30min)
作为一名程序员,使用Github来进行代码的版本管理是必修课,但是这门课在学校里不会有老师来教,所以在这里总结一下Github的基本操作,本篇默认您已经安装了Git,笔者的操作系统环境为,所有演示操作均在此环境中进行,Windows同理。
2024-12-25 21:49:50
605
2
原创 Ubuntu20.04安装搜狗输入法
然后将搜狗输入法选择为第一项。进入你下载的路径中然后执行。安装完成之后,安装相关依赖。,重启之后,进入输入法配置。版本的安装包进行下载。然后,在搜索框中找到。
2024-12-25 12:38:54
1695
转载 【转载】解决Ubuntu(20.04)和Windows双系统时间不同步问题
https://www.cnblogs.com/xiaotong-sun/p/16138941.html
2024-11-10 14:06:57
206
原创 cpp中容器push_back和emplace_back的区别
没有创建临时对象,也不需要调用拷贝或移动构造函数。只会调用一次有参构造函数,性能上更优。时会先调用类的有参构造函数创建一个临时变量,再将这个元素拷贝或者移动到容器之中,而。只能用于直接在容器中构造新元素的情况,如果要将现有的对象添加到容器中则需要使用。调用构造函数构造对象,避免临时对象的创建和拷贝或移动。:会先构造一个临时对象(调用有参构造函数),然后将其。(调用有参构造函数)。添加到容器中(拷贝或移动)。,避免额外的拷贝或移动构造。:如果你有现有的对象,像。,导致了额外的对象拷贝。
2024-10-16 09:43:45
1141
原创 关于cpp的lambda匿名函数那些事
熟悉python的同学都知道,python中存在lambda匿名函数,这种函数往往只能完成简单的功能,常用于内嵌函数:如map()filter()sorted()等高阶函数。中的匿名函数(也称为lambda表达式)是一种可以定义的方式,它不需要显式地命名函数名称。匿名函数常用于需要传递简单函数的场景,例如回调、算法或事件处理程序。C++从C++11开始引入了 lambda表达式,并在后续版本中不断增强其功能。
2024-10-15 10:35:21
1146
原创 Awesome C指针详解
它的主要作用是能够动态地调用不同的函数,这为程序设计提供了极大的灵活性。指针进行加减时,需要将整数乘以指针类型对于的字节长度,这样指针才能正确找打其应该所在的位置。这里列举了一些比较复杂的指针的例子,可以多多揣摩,孰能生巧。指针本身是一个地址,在32位机器中占4个字节,在64位机器中占8个字节。时,表示取了整个数组的地址,类型是一种数组指针。),表示你获取了整个数组的地址,而不是某个具体元素的地址。)时,它通常会被转换为指向数组第一个元素的指针,类型是。时,表示取了整个数组的地址,类型是一种数组指针。
2024-09-13 10:30:28
1285
原创 cpp实现字符串八股strcpy()、strlen()、strcat()、strcmp()
开始的地址空间内,返回值的类型为。结束符的字符串复制到以。所指向的字符串添加到。
2024-08-30 12:37:58
399
原创 C++中的优先级队列priority_queue和双端队列deque用法详解
deque 是双端队列(Double-Ended Queue),支持在两端进行高效的插入和删除操作。与 std::vector 类似,它也提供了随机访问功能,但与 vector 不同的是,deque 可以在头部和尾部都进行高效的插入和删除。,优先级队列priority_queue的使用和普通的队列非常类似,只不过优先级队列的底层实现是Heap能够对队列中的元素进行排序,我们可以让大的元素排在前面或者让小的元素排在前面。使用优先级队列需要包含头文件。
2024-08-27 22:44:00
965
原创 C++中的强制类型转换关键字static_cast、dynamic_cast、reinterpret_cast和const_cast
是一种低级的、危险的转换,它可以将一种类型的指针直接转换为另一种不相关类型的指针,或者将指针转换为整数,反之亦然。用于在继承关系中进行安全的向下转换(从基类转换为派生类)。在 C++ 中,类型转换是指将一种类型的数据转换为另一种类型的数据。注意:reinterpret_cast 可能导致未定义行为,应谨慎使用,通常不推荐在一般应用程序中使用它。这些操作符比 C 风格的强制类型转换更安全和可控,提供了更精确的转换语义。限定符,但它也可以用于向对象添加这些限定符。限定的对象的值时,去掉。
2024-08-26 19:05:21
1147
原创 C/C++前置声明
C语言中,结构体类型在声明之后,未正式定义之前是一个不完全类型(incomplete type),即只知道其是一个类型,但不知道包含哪些成员。不完全类型只能用于定义指向该类型的指针,或声明使用该类型作为形参指针类型或返回指针类型的函数。需要注意的是,在使用前置声明的时候,我们只能定义为指针,因为前置声明只是告诉编译器有这种类型,并没有给出具体的定义,所以当我们进行实例化的时候,需要为其分配内存空间,由于还不知道类型大小,这样一样会报错,使用指针就能避免这个问题。的完整定义,这样编译器会报错,因为。
2024-08-21 10:19:29
800
原创 【Linux】使用nm命令查看动态库包含的符号表
nm命令来自name的简写。nm命令常用于查看二进制文件中的符号表,通常用于静态库和可执行文件。对于动态库(如.so文件),你可以使用nm命令结合特定的选项来查看符号表。
2024-08-14 09:54:10
1147
原创 【Cpp筑基】四、重载运算符、友元、类的转换函数
【Cpp筑基】一、内联函数、引用变量、函数重载、函数模板【Cpp筑基】二、声明 vs 定义、头文件、存储持续性作用域和链接性、名称空间【Cpp筑基】三、对象和类【Cpp筑基】四、重载运算符、友元、类的转换函数在C++中,运算符重载(operator overloading)允许开发者定义或重新定义标准运算符的行为,使其可以用于自定义类型(例如类)。通过运算符重载,可以让用户定义的类型与内置类型一样自然地进行运算操作,提高代码的可读性和易用性。运算符重载是在C++中提供的一种特性,允许为用户定义的类型(
2024-08-08 09:55:39
294
原创 【Cpp筑基】三、对象和类
内联函数是一种建议编译器在每次调用该函数时,将其代码插入到调用点处,而不是进行常规的函数调用。这可以减少函数调用的开销,提高程序执行效率,尤其是对于短小的函数。
2024-08-07 15:00:23
1070
原创 【Cpp筑基】二、声明 vs 定义、头文件、存储持续性作用域和链接性、名称空间
什么是声明?什么是定义?在C++中,声明(Declaration)和定义(Definition)是两个重要的概念,它们在程序的组织和编译过程中起着不同的作用。声明是告诉编译器某个变量、函数、类或者其他标识符的名称及其类型,但不包含具体的实现或者初始化,声明的主要目的是让编译器知道这些标识符的存在及类型。声明(Declaration):告诉编译器某个变量的名字和类型,但不分配存储空间(除非它也是一个定义)。定义(Definition):不仅告诉编译器变量的名字和类型,还分配存储空间。变量声明。
2024-08-06 15:48:27
1197
原创 【Cpp筑基】一、内联函数、引用变量、函数重载、函数模板
左值(lvalue,locatable value)是指能够定位的值,它表示存储在内存中的某个位置的对象。因此,左值是可以取地址的,可以出现在赋值操作的左侧。右值(rvalue,readable value)是指不具有持久存储位置的临时值,它通常是表达式求值的结果。,如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而变量名是不重要的。C++提供了一种内联函数,在 C++ 中,内联函数(inline function)是一种特殊的函数,其定义使用。例如,创建一个引用变量。
2024-08-06 10:27:19
1033
原创 vscode配置latex环境制作beamer ppt
写在前面,笔者之前一直使用overleaf来制作beamerppt,但是免费版本会限制编译时间上限,故在本地配置了latex环境用于制作beamerppt。🚀环境配置🚀。
2024-07-07 16:25:24
1533
原创 模型预测控制MPC详解(附带案例实现)
写在前面本文是记录学习B站博主Dr.can的学习笔记,如有侵权请联系笔者删除此文。最优控制问题就是研究在约束条件下达到最优的系统表现,通常系统的表现是综合分析的结果。比如考虑一个单输入单输出的系统(SISO),状态变量xxx,输出为yyy,要求其输出能跟踪预设的参考值rrr,误差可以表示为e=y−re=y-re=y−r,那么最优控制的目标是min∫0te2dt\min \int_0^t e^2 dtmin∫0te2dt如果同时希望输入量uuu也能越小越好(一般的目的是减少能耗),那最优控制的目标可以
2024-06-20 15:42:12
26272
12
原创 使用pypi安装包的时候报错【网络不可达】
这种情况一般是我们国内的网络不好,不能直连,所以我们可以在。这样就能解决网络不好的问题,顺利安装了。语句后面指定一个国内的镜像源。
2024-06-20 09:32:16
783
原创 动手学操作系统(七、实现内存分页机制)
在上一节中,我们成功读取了物理内存的容量,并且在之前的学习中,我们的程序已经进入了保护模式,地址空间能够达到4GB,但是所有的进程(包括操作系统)都需要共享这4GB的空间,为了更好得维护这4GB的虚拟内存空间,我们需要使用内存分页机制。:指计算机中实际存在的硬件内存,即RAM(随机存取存储器)。物理内存由具体的内存芯片组成,直接用于存储正在使用的数据和程序。:是操作系统提供的一种内存管理技术,它为每个进程提供了一个连续的、私有的地址空间,使得每个进程认为自己拥有独立且足够大的内存空间。
2024-06-13 14:34:04
1163
原创 动手学操作系统(六、获取物理内存容量)
在上一节中,我们介绍了保护模式和实模式的区别,保护模式的最大特点是“大”,“大”是指寻址空间大,在进入保护模式之后,我们还将要接触虚拟内存、内存管理等,但这些和内存有关的概念都是建立在物理内存之上的,所以无论理论上的概念有多高大上,最终还是要落实到物理内存上才行,所以这一节我们来学习如何获取物理内存容量。
2024-06-12 11:45:15
742
原创 Docker 快速入门Ubuntu版(1h速通)
写在前面,本教程主要参考ChatGPT-4o的回答,以及网络上查找到的其他资料,这里主要是记录了笔者的学习过程,难免会有批漏,还烦请请各位指出。另外,我使用的系统为,请大家注意区别。如果您在查看的时候遇到了问题,请在进行查找。
2024-06-06 14:19:26
1712
1
原创 【Moveit】step或stl文件转urdf,并添加到机械臂上
ROS专门提供了一种机器人建模方法——URDF,用来描述机器人外观、性能等各方面属性。所以我们需要将别的描述格式转换成URDF,才能在ROS中使用。
2024-06-03 13:55:52
3129
2
原创 控制障碍函数CBF详解(附带案例实现)
由于这个优化为一个凸优化问题,因此其实时性是可以被保证的,CLF约束通常用松弛变量来保证问题的可行性,如果没有松弛变量,控制器将指数稳定到系统原点。为了使收敛更加迅速,我们需要考虑收敛的时间限制,指数收敛是一种快速的方式,所以我们希望最终的结果能够按照指数的方式进行收敛。是线性的,因此用最小范数控制器,二次规划的目标位最小化控制量,受限制为,满足李雅普诺夫函数收敛的上界以及控制量。,所以此CBF是一个可行的CBF,那么我们最终获得的CLF-CBF-QP为。,是系统的控制向量场,它描述了系统的控制输入。
2024-05-31 15:25:33
5060
1
原创 动手学操作系统(五、实现保护模式下的Loader)
在上一节中,我们使用了MBR来加载的Loader,Loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载Kernel,上一节只实现一个在实模式下工作的简易Loader,打印了一些消息,但是我们并没有完善这个Loader的功能,在这一节中,我们进一步完善这个Loader的功能。
2024-05-30 17:01:04
1082
原创 动手学操作系统(四、MBR读取硬盘加载Loader)
硬盘属于存储介质,在硬盘的发展历史中,随机存取具有划时代的意义,程序中的算法不用再考虑存储时间,访问任意数据所用的时间几乎是相等的,这一改之前的存储设备其存取时间呈线性的历史。为了让硬盘工作,我们需要通过读写硬盘控制器的端口,端口就是位于IO控制器上的寄存器,这里就算指的是硬盘控制器上的寄存器。硬盘的控制遵循标准ATA(Advanced Technology Attachment),ATA的标准有些冗长,这里只简单介绍我们需要使用到的部分,如下图所示。
2024-05-29 14:18:40
1252
原创 动手学操作系统(三、通过IO接口直接控制显卡)
为了兼容大量的硬件外设,CPU需要增加一“层”来解决不兼容的问题,在CPU和外设之间的这一层就是IO接口,IO接口的形式不限,它可以是电路板,芯片,插槽等等,它的作用就是在CPU和外设之间做相互协调的转化。设置数据缓冲,解决CPU与外设的速度不匹配设置信号电平转换电路设置数据格式转换设置时序控制电路来同步CPU和外设提供地址译码。
2024-05-28 18:06:20
1138
原创 动手学操作系统(二、编写MBR主引导记录)
在之前的学习内容中,我们已经实现了基本的仿真环境bochs的搭建,还首次使用硬盘引导启动了bochs,虽然我们只卡在了启动的界面,但是我们已经顺利的搭建起整个流程了。
2024-05-28 15:44:15
953
原创 ubuntu使用oh my zsh美化终端
是一个命令语法校验插件,在输入命令的过程中,若指令不合法,则指令显示为红色,若指令合法就会显示为绿色。即可,然后别的一些环境变量的设置可以直接复制过去。,将其修改为已经安装的主题就行,保存然后退出,打开终端。按照相同的流程,我们即可配置这个插件,将其git到。等,要进行移植其实很简单,大部分的时候我们只需要将。oh-my-zsh内置了很多主题,可以进入路径。如果想要修改成自己喜欢的主题,可以。然后安装oh-my-zsh,参考。然后配置了一些资源路径,比如。zsh的内置插件可以在路径。,只需要将其git到。
2024-05-28 11:57:04
2748
原创 动手学操作系统(一、搭建实验环境)
🚀 环境配置 🚀笔者的环境使用的是这里的ubuntu你可以在虚拟机里安装,也可以安装双系统,也可以是单独的ubuntu系统,这个就看个人的喜好。针对初学者来说,笔者推荐使用虚拟机平台VMware在window环境下来安装ubuntu。或者可以使用VirtualBox在linux环境下安装ubuntu。
2024-05-27 16:49:32
1320
原创 ubuntu使用shell脚本切换conda虚拟环境
错误表明在脚本中找不到source命令,这通常是因为脚本运行时没有使用Bash解释器。Bash是默认的Unix shell,但是如果你使用sh命令来运行脚本,可能会使用系统中的其他shell,比如dash。而source命令是Bash的内置命令,不是所有shell都支持。所以,要确保你的脚本以Bash解释器运行,你可以修改脚本的第一行为。使用shell脚本来切换conda虚拟环境,容易报。找不到的错误,这是因为我们没有对。第二种,需要手动进行修改。替换成你自己的即可。脚本的时候一定要使用。
2024-05-17 17:31:21
1487
原创 欧拉角与旋转矩阵之间的相互转化(推导和Python代码)
表示三维空间中的旋转可以有多种表示的方法(旋转矩阵,欧拉角,四元素,轴角,李群李代数)。欧拉角表示法,分别是指定了三个角度yaw,roll,pitch,分别是绕z轴,x轴,y轴的转动的角度。
2024-05-16 14:57:12
1670
原创 相机模型的内参、外参
相机将三维世界中的坐标点(单位为米)映射到二维的像素平面(单位为像素)的过程能够使用一个几何模型来进行描述,为了简单起见这个模型我们通常使用。同时,由于相机镜头上透镜的存在,透镜的安装不能保证绝对的准确,因此在成像的过程中还会出现。因此,我们使用针孔模型和畸变模型来描述整个投影过程。针孔模型和畸变模型能够把外部的三维点投影到相机内部的成像平面,这组参数就构成了相机的。
2024-05-15 13:22:44
2184
51单片机课程设计优秀作品(步进电机的控制)可以实现正反转,加速减速,矩阵按键设定转速。
2020-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人