- 博客(32)
- 收藏
- 关注
原创 qt creator异常崩溃
记录几个工作中总遇到的问题,对于cmake 配置的qt工程,每次通过改动cmake来更改软件版本时,会导致qt creator软件崩溃,并且再次打开还是加载中崩溃.解决办法就是删除build构建文件夹,删除cmake.txt.user文件,然后再重新构建项目。如果遇到lnk2019,可能是只在.h写了函数定义没在.pp写实现,也可能是第二层cmake没有指定相关的库。
2024-07-04 17:51:21 177
原创 bxCAN学习总结
硬件管理的FIFO:FIFO的管理(即数据的存储和读取)完全由硬件来完成,而不需要CPU的参与。bxCAN的接收处理是通过FIFO来实现的,接收到的报文被存储在3级邮箱深度的FIFO中。硬件过滤:过滤器的工作是由硬件来完成的,而不需要CPU的参与。这样可以减轻CPU的负担,因为如果过滤工作由软件来完成,那么就需要CPU来处理大量的数据,这将占用CPU的资源。总的来说,bxCAN是一个功能强大的CAN接口,它能够有效地处理大量的报文,同时还提供了多种工作模式和测试模式,以满足不同的应用需求。
2024-05-18 16:28:58 567
原创 为什么copilot突然不能用了
点击"请重新登陆"后还是会回到这个界面,edge右上角也不显示copilot图标,有没有兄弟知道解决办法的。
2024-04-16 22:14:53 240 2
原创 MFC:字符编码与_T宏、TCHAR
当开发环境为UNICODE时 #define __T(X) L ## X 有效。当开发环境为多字节编码时 #define __T(X) X 有效。_T宏与TCHAR在头文件<tchar.h>中。UNICODE对应wchar_t类型。
2024-01-09 11:47:53 483
原创 ModBus学习总结
接收:01 03 14 00 0B 00 0C 00 0D 00 0E 00 00 00 00 00 00 00 00 00 00 00 00 1B CA。从站地址+功能码+起始寄存器+寄存器数量+CRC(校验算法)从站地址+功能码+字节计数+具体数据+CRC(校验算法)1号站点 读取寄存器 起始地址 读10个寄存器。发送:01 03 00 00 00 0A C5 CD。1号站点 读取寄存器 返回20个字节的数据 (从ModBus Poll获取报文。
2023-12-13 10:38:16 1604 1
原创 Linux下的各种信号
(31):错误的系统调用信号,在进程执行错误的系统调用时产生。(24):超出 CPU 时间限制信号,在进程超出 CPU 时间限制时产生。(5):跟踪/断点陷阱信号,当进程执行单步调试或遇到断点时产生。(21):后台读取终端信号,在后台进程从控制终端读取数据时产生。(22):后台写入终端信号,在后台进程向控制终端写入数据时产生。(25):超出文件大小限制信号,在进程超出文件大小限制时产生。(7):总线错误信号,当进程访问无效内存地址时产生。(8):浮点异常信号,当进程执行浮点运算错误时产生。
2023-08-16 20:41:54 831
原创 C++:TCP通信服务端
方法一:close();方法二:closecket();方法三:shutdown(int socket, int howto)其中,howto 参数是这个函数的设置选项,它有三个选项:SHUT_RD(关闭连接的读方向),SHUT_WR(关闭连接的写方向),和 SHUT_RDWR(关闭套接字的读和写两个方向)。至此服务端就写完了。
2023-08-10 21:40:49 619 1
原创 C++:用模板手撕AVL树
插入节点时,会导致树产生四种不平衡状态中的一种,所以要分四种情况解决。(3)左-右:先让左子树左旋,转化为左-左,然后根节点右旋。(4)右-左:先让右子树右旋,转化为右-右,然后根节点左旋。(1)左-左:直接右旋。(2)右-右:直接左旋。
2023-08-10 11:22:35 249 1
原创 C++:把手写的list容器封装为hpp文件,同时增加一个初始化列表构造函数,用gdb断点调试找到段错误并修改
这个错误信息大概就是没有定义并初始化头尾双指针,因为创建List对象的时候没有调用默认初始化函数,而是直接调用了初始化列表构造函数,那么只需要在调用初始化列表构造的时候调用一下默认构造,对双指针进行定义和初始化即可解决问题。使用gdb进行调试,发现出现段错误的地方来自list.hpp的尾插函数push_back()首先给出用类模板写出的list容器的代码,把代码放到list.hpp文件中。然而运行却出现了段错误。
2023-08-08 10:49:45 79
原创 C++:用类模板手撕list容器
按指定值删除,因为是仿写list容器,list容器的remove函数会把所有和指定目标相等的数据全部删除,所以我这个函数也是全部删除。最后删除所有元素,我这里写到析构函数里面了,也可以拿出来单独封装一个函数。再封装一个容器类,里面存储链表的头尾指针,然后写一些常用的函数。然后提供一个简单的测试案例,测试代码的功能完整性。然后就是返回首尾指针,类似返回首尾迭代器的功能。list是个双向链表,先定义一个双向链表。可以看到,没有任何问题。
2023-08-07 19:31:52 253
原创 C++:定义一个复数类,重载+-运算符,同时重载两个版本的<<运算符
(1)重载为类成员函数,这种情况下重载函数的第一个参数是隐式的this指针,就比如上面的operator+,参数是两个plural类对象,但是只需要传一个参数。此时我们调用时可以有一下两种写法,因为函数返回一个临时对象,我们用p3和p4去接收。这个函数需要写在类里面,如果写在类外需要去掉friend,同时在类内使用friend进行友元声明,这时候就可以直接通过cout对类对象进行输出了。这种形式才能打印到屏幕,这很明显不符合我们的预期,那种就只能使用另一种重载方式。(2)重载为类的友元函数。
2023-07-29 15:43:34 382
原创 当函数返回值为类对象时,会调用拷贝构造还是移动构造
可以看到,这次拷贝构造与移动构造都存在,优先调用了移动构造函数,这里编译的时候依然要禁止编译器优化,不然移动构造函数也不会被调用,那我可不可以认为编译器优化其实就是系统调用了一个默认的移动构造函数?编译器之所以进行优化,因为拷贝构造函数会降低编译效率,增大内存占用,所以编译器默认进行了一个优化,这个优化就是直接使用s1的内存对s进行构造,这个方法有点类似于移动构造函数,那我们就手写一个移动构造函数加到类student里面看看效果。这种优化可以提高代码的性能,但它并不会调用你定义的移动构造函数。
2023-07-27 11:36:25 709 1
原创 C++手撕单链表
这里依然要把麻烦的头指针单独拿出来写,遍历的时候,要使temp指向被删除结点的前一个结点,好进行删除后的链表拼接。由于这里我是直接用head去遍历链表,所以参数是以形参的形式传入,不能以引用的形式传参(node*& head),不然head的值和指向会被改变。最后写一个升序排序的函数,这个排序是根据val的值重排链表的所有结点,而不是简单的给结点的val值进行排序。写一个尾插函数,传入链表头结点,并给插入的新结点赋值key,这里不要忘记处理空链表的情况。查询值为val的结点,并返回这个结点,打印出下标。
2023-07-19 16:05:58 115
原创 C++:静态类成员属性和静态类成员函数
这里我们类内声明了一个静态成员变量 total ,这个变量total必须在类外定义,在不赋值的情况下,total的默认值为0,在构造函数中,每创建一个对象total+1,每析构一个对象,total-1。然后通过静态成员函数show_Total()查看total的值。关于这个静态成员函数show_Total(),我们在这个函数里面是不能调用任何非静态类成员属性和非静态类成员函数,而且也不能使用this指针,因为this指针只能在非静态函数内部.我们在这个函数内只能通过类作用域访问其它静态类成员和静态类函数。
2023-05-31 22:32:06 84 1
原创 C++中一些易出错的语法点
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。比如:操作系统、硬件或者其它线程等。可以去除const和volatile的限定属性(有默认值的函数参数必须写在最右边,防止歧义。在C++的函数模板、类模板中,利用。,都可以通过const构成重载。可以通过const构成重载。
2023-05-26 23:10:25 55 1
原创 Qt学习日记:函数指针解决自定义信号和槽的重载
自定义槽函数treat,此处有参构造涉及类型转换,防止打印引号。下面两个函数指针,指向重载的参数为QString的有参函数。通过函数指针,防止有参函数和无参函数的调用混乱。上面两个函数指针,指向两个无参函数。自定义信号hungry。
2023-05-06 14:56:33 263 1
原创 封装一个C头文件,避免每次写代码敲很多行头文件
这个头文件里面包含了我平时编程过程中常用到的头文件,然后我们输入下面的命令把他拷贝到系统里面(我用的VScode的终端编译,如果你使用虚拟机里面的Ubuntu编译的话,要给虚拟机里面的Ubuntu也拷贝一下)我试了下同一段代码,一个使用<myhead.h>,另一个只包含代码段用到的头文件,发现他们编译出来的可执行文件大小是一样的,因此也不必担心包含过多没用的头文件是会造成资源浪费。我的平时的开发环境为VS code + Ubuntu18.04。
2023-05-02 15:13:02 317 1
原创 linux下的多进程创建
之后我们再调用一次fork()函数,根据上面的理论,主进程和它的子进程都会调用一次,各创建一条属于自己的子进程(有点类似细胞分裂),此时就有了四条进程,然后print(3)就会被四个进程各执行一次,数字3也就打印了4次当然,最后那条printf("进程结束")也一样打印了四次。当3打印出来时,就意味着有进程运行完了,但是上面打印了两个3时,却只打印了一行进程结束,这是因为有一个3是主进程打印的,主进程需要等待所有子进程结束。也就是说,主进程只创建一次进程,而子进程会创建第二次进程,所以一共有3条进程。
2023-04-27 15:09:23 557 4
原创 C语言中缓冲区与标准IO函数的注意事项
scanf函数遇到 空格,回车,换行符就会结束,而这些字符就会留在缓冲区影响fgets接收数据,代码中的putchar可以显示接收的一个字符,可能是空格,回车,换行符.如果scanf用回车结束输入,如果不设置getchar去接收这个换行符,for循环的第一次就会被换行符跳过.
2023-04-18 18:38:49 110 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人