自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c语言多条件高效跳转

/ 数组索引从0开始,模式1对应索引0。void mode1() { printf("模式1\n");void mode2() { printf("模式2\n");void mode3() { printf("模式3\n");printf("未知模式\n");// 函数指针数组,索引对应模式编号。// 检查模式合法性并调用对应函数。// 各模式的处理函数。

2025-05-30 00:26:09 183

原创 word的页眉页脚设置

然后设置奇偶页不同,就可以在本节更改奇偶页页眉,注意的是页眉和页脚的奇偶页属性是绑定的,页脚也会变成奇偶不同,所以在设置页码的时候,就需要奇偶各设置一次。然后是页码,可以看到这是偶数页页脚,与上一节相同,就是偶数页码单独设置,上一节没有设页码,就接着前一奇数页脚设置数字了。首先是分节,先把光标设在摘要前,然后布局,下一页,这样可以一节一节的管理页眉页脚。接下来是第二章的页码怎么接着第一章呢?要连接前一节,并且续前节。记录一下这难用的word,以防下次写论文时想不起来怎么设置。

2025-05-26 09:48:47 374

原创 【无标题】

这是我做过的最抽象的电路板 ,设计的有缺陷,我又不想重新画,就抓着脑袋对着已经画完的魔改。结果让电容抱对,用二极管来空中架桥,甚至可以在稳压芯片下垫张纸来绝缘,结果竟然真的能运行。

2025-05-15 21:42:29 227

原创 stm32 debug卡在0x1FFFxxxx

自己画的一个四轴飞机电路板,之前还能debug,改了一下mos管两端的电阻,还能正常下载,蓝牙接收也正常,但是debug出问题了,刚下载就自动运行,然后程序就在0x1FFFxxxx附近循环运行,这一块不是flash区了,是程序的启动区,应该是boot出问题了,检查了一下电路图,我的boot0引脚没有接下来电阻,是浮空的状态,就导致它电压不稳,在debug的时候应该来回跳变了,接了一个10k的电阻就好了。

2025-05-09 20:56:52 338

原创 cpp学习笔记4

中间几行报错的已经注释了,n.print_base(),就要看到Base类,print_base()在base里是public,引用到ProtectedDerived就变成了protected型,再到Nesting2还是protected,所以无法在main里调用。因为两个Var最后都要追溯到Base,所以每个类的Var地址都是一样的。无论以哪种方式继承,都只能访问基类的protected和public,不能访问private,不同的继承方式只改变继承到的方法在派生类里的类型,从而影响在类的外部访问。

2025-05-09 11:31:43 263

原创 cpp学习笔记3--class

据前面的经验,它的使用方法应该是a<<b,相当于a.operator(b),b是std::ostream& os型,a应该有成员real,imag,所以是Complex a;首先,使用方法依然是a<<b,刚知道因为operator在Complex类中,它的左操作数就必须是这个类的,右操作数b显然也是这个类,这里a并未使用,依然可以运行,但是只能让os=cout,我们想进行其他操作就必须改变顺序,做到os<<Complexhans,这就需要friend改变传参顺序了。首先,在 C++ 中,

2025-05-07 15:16:56 230

原创 cpp学习笔记2--class

需要注意的是,s1虽然无法访问balance,但是可以访问print,print可以访问balance,也就是private变量不可以直接访问,但可以间接访问。double getBalance() const,首先这个const放在后面我是没见过的,它的意思是这个函数不允许修改除了mutable型之外的class的成员变量,无论是private还是protected。可以看到,bank的地址和interest、road乃至s1都不一样,只和cat是一类的,说明它不属于堆栈区。关于类中定义静态变量。

2025-05-06 11:37:35 358

原创 cpp学习笔记1--class

第一个初始化初始的是默认值,不需要传入参数,也不需要括号。Person(const Person& other),&p3==&other是成立的,而p4是一个新创建的Person,所以地址不同,Person p4=p3,也是可以直接调用这个拷贝函数的。说明Person之前的name和Person里的n是同地址的,而Person里的n和name是不同的,这是因为第一个name是在main里定义的,第二个name是Person的一个private变量,改成std::string xname = "Mike";

2025-05-05 17:09:00 327

原创 mpu6050读who_am_i寄存器一直读0x7c

正常情况应该读0x68的,可我的一直稳定度0x7c,先用一套正确的代码,读的就是对的,说明模块没问题(因为买到过背面印MPU6050的假模块,也烧过模块,所以需要检查一下),然后用示波器看了正确代码的sda波形,发现两者波形一样,只不过正确的波形的速率比我快,就是它的延迟函数比我短,这点延时应该不会有影响的,所以我应该就是读到正确数据了,却把他解析错了,应该就是read_byte函数的问题。最后的结果真是让我无语,检查了两天了,发现问题是。我堂堂一届老鸟,竟然栽在这了。

2025-04-09 22:14:36 354

原创 汇编语言相对于c语言的优势

可以看到c语言多了一行MOV R1,b.这是因为编译没有这么智能,在生成汇编代码时只能按照固定规则,很多时候不能优化掉冗余部分。此c语言转成汇编语言。而汇编语言实现a+b。

2025-02-25 20:47:27 126

原创 海康威视摄像头登录IP

一直无法访问海康威视摄像头的IP,综合上3个资料,终于进去了。

2025-01-03 20:57:16 337

原创 以电机控制为例,理解控制理论中的pid

对于阶跃输入的电压,电机需要一定的响应时间才能达到期望输出转速。而pid的作用就是用p*error+i/s+d*s来替换U,使最后的n(s)恰好消去p/s+d/(T*s+1)部分,那样转速就能达到立即响应的效果,那么你的那些美好想法就能实现了。为了让电机达到指定的转速,很朴素的想法就是,测量的反馈值和目标值作差,即error=feedback-measure,让控制电压和error成正比,那么这个误差值一旦大了,那输出电压就会变大,让电机转的更快或更慢来达到目标值,这就是pid里的p,即比例部分。

2024-12-23 23:15:03 193

原创 c语言用邻接表实现有向图的构建

列表没掌握牢,导致有向图弄了一晚上,下次再写图的遍历了。

2024-12-06 22:01:00 151

原创 c语言,支持输入数字和字符的函数

在学数据结构的图的创建的时候,书上用的是0来代表图的终止,这样0值就不能使用了,我不满意,我想做到输入数字时给图上的节点赋值,输入字符时终止此路径的创建。所以这个函数就诞生了。

2024-11-15 21:50:15 213 1

原创 c语言实现矩阵运算

本来想用二维数组或指针存储矩阵的,但是二维的无论是指针还是数组都必须至少有一维的长度是确定的常量,不能是变量,就不能进行任意规格的矩阵的运算,所以我选择了用一维数组来模拟矩阵进行存储(坚持痛苦尝试了两天,最后还是无奈放弃了二维数组的方案)。求逆阵是用的高斯消元法,有会行列式法求解的老哥也可以在评论区分享一下,让我长长见识。

2024-10-29 21:45:12 447

原创 c语言的一些高级用法18

注意区别str和&str,它俩的值虽然相等,但是str是代表数组首元素的地址,&str代表的是整个数组的地址,所以w+1就是str的下一个数组str2的数组地址&str2,所以是str的地址加5(跨过str的所有元素),*(w+1)就是str2,即这个数组的首元素地址,**w就是*str=str[0];输出结果y=676722424,y[0]=1813687320,y[1]=1813687312,&y[0]=676722424,&y[1]=676722432,*y[0]=97,*y[1]=99。

2024-10-28 11:07:44 438

原创 c语言的一些高级用法17

因为docall的参数是void*,而call(x)是void。那么docall怎么得到call的参数x呢?实际在调用的时候会令call=func(x),如此docall就知道call的参数了。之所以要%ARRAY_SIZE是因为队列的头尾可能会绕着数组转几圈。队列用循环数组表示,在头和尾中间留一个空位区分空队和满队。对于这个程序,堆栈生长方向如上,所以出栈,入栈操作是。

2024-10-26 19:44:22 167

原创 c语言的一些高级用法16

define SQU(x) x*x,这个宏定义是有问题的,如SQU(a+1)结果就是a+1*a+1,所以应该#define SQU(x) (x)*(x).同理#define DUAL(x) (x)+(x),在2*DUAL(a)时也会错误,所以应该#define DUAL(x) ((x)+(x))这会永久的改变x和y的值,又MAX(getchar(),getchar()),你可能是想比较两个数字字符谁代表的数字大,但是#define MAX(x,y) (x)>(y)?可以避免头文件被嵌套过深。

2024-10-15 16:02:12 219

原创 c语言的一些高级用法15

对于char *array[ ]={"dap","mefs","oiu"}执行printf("%c",*++*(array+2));既然如此,对{"dap","mefs","oiu"}而言,*(array+2)明显是"oiu",所以*++*(array+2))就是'i';就相当于add(a,b);字符串是指针常量,如"asd"在编译器眼里就是一个首地址,访问"asd"+1就是's',"asd"[2]就是'd',借助这一点,"0123456789ABCDEF"[value%16]就可以方便的转十六进制。

2024-10-14 22:52:37 136

原创 c语言的一些高级用法14

常量指针:const int* a,int const*a.地址a是可以被修改的,但是指针*a不可以;指针常量:int *const a,地址a不可以被修改,但是指针*a可以。这个函数中,函数指针com在开始时传入的参数并没有命名,但是在真正调用时就声明了,传入的参数为a,b。函数指针所指向的函数定义时也是要给参数命名的。

2024-10-12 22:36:11 177

原创 c语言的一些高级用法13

a是一个指向函数的指针,传入一个整数型参数,a=f将函数名f,也就是函数f的地址赋给a,那么a就是函数f了,a(2)就是f(2),但是也可以显式的声明,让a=&f,&可加可不加。不仅如此,a(2)和(*a)(2)也是一样的;这个相当于(int*) a(int i);就是一个普通函数,只不过return (int *);单链表只有一个指针域,所以只能单向遍历,双链表有两个指针域所以可以双向遍历,但是要注意双链表的首尾都有一个NULL。函数名在内存中是一个地址,所以可以将其当地址用,有如下代码。

2024-10-11 22:49:36 191

原创 c语言的一些高级用法12

link是指针,存储是void *型,占1个字节,接着value占一个字节,地址n1就是结构体n1的首地址就是&n1->link,因为link是结构体n1的第一个成员,而n1->link的最后落脚点是link,是一个地址,此地址可以手动设置为n2的首地址,那样两个结构体就联系在一起了。12.2考虑了插入值小于首值的情况,处理方法是更改根节点为new,之后的链表因为未修改,所以他们的指向不变,因为如果传入函数的是*root,则root是形参,无法修改,所以需要传入**root。玩了快一个月了,回来继续更了。

2024-10-09 20:56:53 371

原创 c语言的一些高级用法

内存的存储规则要求,int型因为是4个字节,所以它存储的起始位置必须能被4整除,char型1个字节,能被1整除就行了,又因为要保证下一个创建的结构体的int起始位置也满足要求,所以一个结构体占用内存要是4的倍数,所以此结构体占用内存为1000 1111 1000,1为占用内存,0为空占位,而如果是struct AX{int a;则内存是1111 1 1 00,共占用8个字节空间,虽然还有两个浪费,但利用率大幅提高。最近在看《c和指针》,每天会更新一些,如有错误望指正。

2024-09-09 22:15:51 224

原创 c语言的一些高级用法

或struct{int a;或struct ST{int a;或typedef struct{int a;像这样的结构体嵌套结构体,可以用exa.sa[1].a来逐级访问。如果函数的参数是指向结构体的指针,那么(*cp).f和cp->f是一样的,箭头本质就是为了简写指针。结构体的成员不能有自己,因为这样会无限循环,但是可以有自己的指针。

2024-09-08 22:41:56 267

原创 c语言的一些高级用法

char *str[10]实际就是个二维数组,他是对数组进行间接访问得到char,所以str[0]就是个地址,那么str就是地址的地址,所以可以访问str[1][2]。在使用strcpy进行字符串复制的时候,源数组比目的数组短是可以的,他会把目的数组的结尾加'\0',所以多余的地方也视为被删除了,是垃圾内存。x-y虽然等于-1,但是用if判定时,结果是大于0的,因为(x-y)也是unsigned int 型的,使用(int)(x-y)就好了。char a[10]="asd",所有的空位都被'\0'填充。

2024-09-07 22:05:57 271

原创 c语言的一些高级用法

这也很好理解,二维数组a[][]相当于**p,*a就相当于*p,对地址只进行一次解码,解出来的是第一行的首地址,*(a+1)就是第二行的首地址,*(a+1)+1就是在第二行首地址的基础上,再往后移动一个元素,这是二维数组的第一行的元素就是普通的int变量,如果是三维数组,往后移一个就是一个一维数组。这也很好理解,a[0]就相当于*p,a就相当于p,那么a[0]=x,就相当于*p=x,所以a[0]在函数中也能被修改。那么*++b就是a[1][9],再*++b就是a[2][0],按照二维数组的存储顺序访问的。

2024-09-03 22:11:18 381

原创 c语言的一些高级用法

递归函数的调用过程是每次调用函数所制造的形参和局部变量都会入栈,暂时存储在堆栈中,当最内层的函数执行完,开始向外层返回时,最后入栈的变量会被消除,然后形参和局部变量的值就是倒数第二层函数执行时的值,以此类推,最后堆栈中的值将会被不断销毁。能用堆栈暂时储存形参的值,这是递归函数和while的最大区别。注意,这个递归函数在第一次执行的时候,是要等binary_to_ascii(q)执行完了,再执行输出的,它的内层也是如此,这就使得它最终的输出顺序是从内向外的,即为先打印首位,再打印末尾,成功矫正了打印顺序。

2024-08-28 22:11:30 148

原创 c语言,删除字符串中的一部分内容

指针部分的实现原理可以看我的上一篇博客。

2024-08-28 20:39:49 172

原创 c语言的一些高级用法

对初始化为常量的指针,可以*(str1+1)='p',可以*(str1+i)=='a'进行比较,但是不能str1++;也不能*str1=*(str1+1),只能将其先复制到新的指针里,char *str2=str1+1;*copy='\0'.因为两者不是初始化为常量,所以可以对地址赋值,注意在末尾加入终止符,但是最后是无法打印copy的,它只是对str1的复制,只能打印str1。

2024-08-26 22:26:44 235

原创 c语言的一些高级用法

如果其对应于{"abc","def","ghi"},那么就可以将其对应于strings[3][3];*strings对应于首3,也就是3行,**strings对应于尾部的3,也就是3列,那么**strings初始对应于strings[0][0];后,就是strings[0][1](在++将其复制完毕后)也就是'b';那**strings就是字符串,*strings是**strings的地址,所以**strings以'\0'结尾,和字符串的结尾一样,而*strings的结尾是内存地址的结尾,是NULL。

2024-08-24 23:13:18 147

原创 c语言的一些高级用法

指针不初始化是一件很危险的事,未初始化将随机给其分配一个地址,这个地址可能是非法的,也可能合法,是一个变量的地址,那你在改变指针的值的时候,那个变量也会被改变,你是很难发现的。int **b=&a;也是合法的,地址a可以再取址,指针b也可以再间接访问。但是可以对a赋值,却不能对&a赋值。间接访问操作*只能作用于指针型,不能作用于整数型,所以*100=25是不对的,可以用*(int *)100=25。最近在看《c和指针》,每天会更新一些,如有错误望指正。空数组的检测结果与0,NULL,'\0'相等。

2024-08-22 21:51:17 183

原创 c语言的一些高级用法

static只改变链接属性为internal,并不改变作用域,局部变量仍然是局部变量,但是会将其存储区由堆栈改为存储器,也就不会重复初始化。有符号数的左右移位是算数移位还是逻辑移位取决于编译器,所以不可移植。无论什么移位都不要移位负数。最近在看《c和指针》,每天会更新一些,如有错误望指正。逗号的作用和分号的作用差不多。

2024-08-21 22:05:09 121

原创 c语言的一些高级用法

源文件里的全局变量的链接属性默认设为外部,所以,不同源文件的同名全局变量可以互相调用,但是不可以重复定义,有且必须只一个定义处,其他地方要用extern声明。非全局变量则不行,不会默认设置链接属性,函数里的局部变量如果与前面的变量同名,会不管之前的变量重新定义一个,但可以使用extern来声明使用的是前面的external型变量。使用sprintf(out,"输出%lld,次数%d",num*num,w);将整数转为字符串,注意num是int64_t,要用%lld,否则后面的w会输出错误。

2024-08-19 19:43:38 168

原创 pygame背单词小游戏

纯粹业余,水平很菜,后续可能会更新。

2024-05-06 22:50:46 357

原创 stm32平衡车

去年寒假就开工了,可困于陀螺仪数据的处理,寒假结束了也没弄出来,今年加入dmp库,又看教程调参,终于算是整出来了,可遗憾的是,加入nrf后,spi和iic的时钟线会冲突,导致两者都无法使用,所以遥控就没能实现。

2024-02-20 10:55:35 624

原创 stm32+oled+编码器+超声波测距=雷达扫描系统

有些bug,也有很多地方可以优化,比如OLED_Cutline用二叉树算法应该效果更好,但是我懒得改了,先这样吧。链接:https://pan.baidu.com/s/1_eccYZEs9K1i1HkJfHaBvw。stm32 雷达系统。

2024-01-21 17:33:09 500

原创 cubemx+mpu6050_dmp+oled

一直想做平衡小车,但是因为mpu的dmp库的hal库的资料不好用,老是搞不定,这个项目就搁置了一年。经过查找一系列的资料,终于能读了,在这就算做一个资料整合,也怕以后又不会用了,留给自己看。

2023-12-09 21:57:43 556

原创 pid误差更新失败

pid误差更新问题

2023-01-31 09:18:37 184 1

原创 nrf一直达到最大重发次数

nrf达到最大重发次数

2023-01-08 15:39:03 380

原创 立创eda显示网络标签未与如何引脚相连

昨天用eda画原理图的时候,出现这种情况,明明网络标签都连在引脚上了,结果它还是说“未与任何引脚相连”。检查了一下发现,所有与c8t6相连的标签都是这种情况,其他的则不报错。于是我就换了一个c8t6,结果就解决了。这应该是eda的bug吧。

2022-10-13 12:56:44 8480 9

空空如也

空空如也

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

TA关注的人

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