- 博客(24)
- 收藏
- 关注
原创 qt复制资源文件产生的文件为只读属性?
我以为是文件被其他进程占用,然后我关掉vscode(此时正打开着这个文件),在前面的读访问后显式地写明file.close。都不能解决这个问题。我又仔细检查了一下拷贝函数附件的代码,发现我不是直接拷贝本地文件,而是把本地文件放入.qrc(也就是qt的资源文件管理下)后再从资源文件中复制出来,放到目标文件夹。本地文件确实可读可写,但是变为资源文件后是只读的,所以从资源文件复制,虽然内容相同,但是属性已经发生了一次改变。这就很奇怪,为什么代码的QFile::copy的会把可读可写的改为只读的,而手动的不会?
2025-09-21 18:21:06
253
原创 问题解决:Qt::ItemDataRole的真实值冲突
这种情况下,我修改type值和objName值,实际上就是在修改Qt::DecorationRole和Qt::DisplayRole所对应的值。这两个值在QStandardItem中其实就是Qt::DecorationRole和Qt::DisplayRole所对应的值。这是一段关于component(组件类)的头文件,我想要给它多设置几个特殊含义的值,于是写了个枚举类型Data。这是一些固定好的,为防止冲突,一般用Qt::UserRole后的值。而这两个值的真实值是1和0。
2025-08-28 11:32:47
274
原创 YOLO GPU环境搭建时碰到的一些问题和解决办法
第二个问题:我兴高采烈地自以为解决了,然后开始训练,发现不仅gpu训练依然不了,连cpu也训练不了了。我看到这一大串,当时就懵了,当天晚上放弃治疗。发现问题所在:torch是cuda的了,torchvision还是cpu,怪不得两边都不讨好。原因:我之前的torch是cpu版本的,在网上找文章看,看到这篇。大佬意思:你torch和torchvision之间的版本有问题。验证:又运行了之前的代码,cuda和cudnn成功链接上了。已经可以用cpu训练了,但是嫌慢,就想搭建gpu训练环境。
2025-06-27 09:14:20
515
原创 RISC-V操作系统学习6:正式出发,初读makefile和源码
1.昨天认识了嵌入式开发,交叉编译,GDB,QEMU等概念,今天我们来点硬核的源码和makefile,本次是代码和知识点编织交错,大家可能也要碎片化地吸收一下。正常情况下,如果工作目录底下也clean文件的话,make会比较它是否比它的依赖项的时间要晚,如果晚,认为它是新的,字面上的新,就执行它。没错这一段像目录一样的东西就是赋值语句,\(反斜杠)的意思就是可以换行继续写,看起来更美观,你删除\然后写在一行也是可以的。以上正常执行就循环,错误执行(循环到了尽头)就执行||后的语句exit(退出),“$$?
2025-03-27 17:19:15
812
原创 RISC-V操作系统学习5:什么是嵌入式开发?
交叉编译时,因为程序是在目标机器上运行的,所以我们的GDB需要在目标机器上开启一个GDB server的服务,通过网络连接,本地GDB可以获取GDB server从“一线”看到的信息。6.当然我们需要做的是risc-v上的操作系统,所以我们使用的编译器也要是能够生成的risc-v架构的,但是笔者在B站上看的这个视频课直接给出了现成的编译器riscv64-unknown-elf-gcc,它可以把我们的程序变成基于risc-v的二进制可执行程序,我们的目标聚焦在操作系统的制作。当然GDB本身也是一个进程。
2025-03-26 21:31:06
921
原创 RISC-V操作系统学习4:一段简单的C代码在内存中是如何放置的?
3.上面说过一个hello.c文件如何在ELF文件的指导下由硬盘加载到内存,但是实际上对于一段代码的变量,字符串什么的在内存中处于哪个节我们并不真的了解,本篇我们就来解决这个问题。注意:全局的static变量的作用域是LOCAL,说明static变量即算声明为全局,它仍然是只能作用于当前的文件内。Num 是每个符号的唯一标识符,这个可以理解,就像是身份证号是我们每个人的唯一标识符一样,一个符号表里不能出现两个一样的Num。8.欧克,咱们弄懂编译阶段,c文件中的变量是如何分配到各个节里面的了。
2025-03-15 12:43:30
397
原创 RISC-V操作系统学习3:用GCC编译代码,并用binutils分析代码
它是对于二进制文件信息的一种描述,这种描述结构很清晰,我们这里看到的数据只是整个ELF的“ELF头”部分,它描述了这个文件所在机器的,这个文件自身的有啥。大家会发现,你没拆开一个GNU,里面就会有一个GNU,就像你没拆开一个递归函数,里面会有一个递归函数的调用一样。3.我们先抛开整体架构,从局部了解两个工具——gcc和bitnutils.作用上一个是编写代码的,另一个是用于分析计算机如何安排这些代码的。GNU是一个软件项目。(3)段(segment):段是按物理位置分的,放在一起的东西是一个段。
2025-03-09 15:38:24
884
原创 串:如何像数组一样使用串|朴素模式|KMP模式匹配算法(next与nextval)
最后改进,nextval其实在此前的基础上很容易理解了,大家发现j=next[j]的回溯其实是可以确定的,没有必要多次回溯,因为等到我们比较到i的时候,前面的字符是什么已经很明显了,回溯后的T[j]与T[i]是否相等是可以确定的,当它们相等时,那不好,因为T[j]与当前主串的那个字符不匹配,移动到相等的T[j]也还是不会匹配,只有不相等时,才有可能匹配(具体相不相等我们无法预知,因为主串当前参与比较的字符是什么我们还不知道)6.讲了那么多如何来求next数组就是我们要解决的最后一个问题,也是最重要的问题。
2024-12-15 11:18:44
676
原创 串:多字符链式存储结构及其函数的实现
9.大量运用前面封装好的函数,插入和删除就可以很容易编写,也很容易维护。(此处的注释是欧我调试时用来判断每一步是否正确的,大家调试时也可以这样,一步步验证,找到bug的位置,比纯粹空想要容易多了)(3)循序渐进:第一次先基本实现,后续改进,可以增强对于异常数据的防御,或者增加新功能(如前面说的覆盖),或者可以在代码的编写上更加清晰优美(增加注释、空格隔开明确结构、明确变量名含义)。4.在末尾添加结点,为串分配值(这里比上次,改进了一个功能,当原串有数据,这里分配值,可以将原数据覆盖掉)
2024-12-12 13:18:21
193
原创 串:单字符链式存储及相关函数的实现
(4)另外,介绍一下缓存友好性,因为cpu的执行指令的速度远快于获取内存中指令和数据的速度,所以有了离cpu更近且材质也更接近于cpu因而速度更快的寄存器,而缓存的速度介于两者之间,当我们上一次访问一个数据后,会把它那块的数据都一起拿到缓存中,下一次访问先在缓存中找,找到了就不用访问内存,没找到,就访问。2.这里写1是因为笔者本来打算单字符和多字符一起聊的,但是因为自己效率比较低并且内容也比较多,所以只写好了部分多字符的代码,下一节咱们再聊。12.下节咱们再聊咯!See you!5.打印,复印,清空。
2024-12-11 19:56:15
288
原创 字符串:顺序存储结构“基石”的实现
笔者敲了一个下午,各种bug,不过这次大家应该(凡事加个应该)可以放心食用了,这些都是跑成功的(之前的或多或少有些bug,但是又懒于修改,所以笔者在之前的文章开头提了一嘴慎读,大家也要小心笔者再次犯错(doge)。12.插入删除其实不难的,但是大家还是可以自己实现一下,笔者搞了好几次错误(PS:豆包蛮好用的,可以帮你查查错误,但是有时候她说的一些错误其实也不是错误,安利给大家)13.串的函数较之前的线性表、栈和队列多了许多,笔者觉得这主要是因为子串概念的提出及串本身在文字编辑等日常生活中的广泛运用。
2024-12-09 18:16:46
352
原创 队列的链式存储结构及其实现
9.循环队列刚开就申请好了空间,而链队列在每一次的申请和释放结点都会有一定的时间开销。不过,循环队列在空间上虽然没有“指针域”,但是总的来说不如链队列来的灵活。如果可以确定队列的最大长度,循环队列胜出,否则,链队列胜出。(当然也没那么绝对,还是要具体情况具体分析)qPtr也可以没有,只不过要把对应的地方全部换为qNode*。10.下节咱们就要聊聊串了!删除队头元素,并返回其元素的值。4.清空队列与判断队列是否为空。3.初始化队列,销毁队列。1.来聊聊队列的链式存储。6.插入元素到队尾。8.看看队列有多长。
2024-12-08 11:22:23
232
原创 队列:定义、顺序存储结构、循环队列
我们让front指向队头,让rear指向队尾,再队列没有一个元素时front等于rear,这个时候出现了一个问题,当元素不断加入时,会再次出现front等于rear,但是此时的情况是队列满了。循环队列,是指元素从后面一直插入到达结尾了,此时后面没有空间了,但是队头的前方因为之前删除元素可能留下了空间,于是从最前面的空间开始插入。1.队列是一种先进先出(FIFO)的线性表,在队头删除元素,在队尾插入元素,这和我们在食堂排队打饭时一样的。(2)浪费一个空间,使得rear+1等于front时,就认为满了。
2024-12-07 10:22:07
224
原创 栈的具体应用:递归与四则运算的实现
2.斐波那契的递归实现很“可怕”,因为你会发现按照上面那个树状图,会有很大的开销,但是大家会发现很多计算是重复的,比如Fibonacci(1)我们就会要重复算好几遍,这些可以改进。1.前面咱们讲解了栈结构的搭建与实现,也提到可以把栈理解为一个线性表的特例,而这个“特例”解决特定问题是很方便的,那么,本节我们就来具体谈谈这些特定问题。这样聊,大家可能还是云里雾里的,不妨把刚刚示例里的中缀变为后缀,实践一下,就明白,其实挺简单的。1.栈的运用还有很多,我们要抓住的是它的特定,先进后出。
2024-12-04 10:12:19
863
原创 操作系统:what and 四大特性
但是异步也有其缺点,编程比较复杂,然后结果如果处理有时差,比方说你看见一个商品现在还有1件,想买,点击购买,它首先会向服务器查询是否还有库存(事实上,你看到的那个1件是五分钟更新一次的,可能在这五分钟内别人已经买走了,但显示还有),然后你异步了,它还在访问库存还剩多少,你就已经完成第二步付款了。具体到一个网够的网站中如果同步了(事实上,基本都是异步的),那么你点击一款商品的链接,它可能需要等一会才能成功跳转,这个时候你只能干等,不能说向下滑动,浏览一下其他商品,点击其他链接,它不会有反应。
2024-12-01 17:48:29
496
原创 快速排序:实现与优化
一模一样,但是不需要在栈上递归,只需要循环,减少了开销。面对不同的数据,我们要采用不同的算法,哪怕是最简单最“笨”的冒泡排序也有其适用之处(基本有序的数据,它一轮就结束了,大家可以添加判断,一轮冒泡如果没有发生交换,说明已经有序,不需要再继续,而其他排序这个判断很难加上去。MAXSZIE有的说7,有的说50,无所谓,大家主要学会这种思想,面对不同的数据,要抓住它的数据特征,选择合适的算法,没有最好,只有最适合。快速排序的思路是随机找一个数,把它移到合适位置(其前面的数小于它,后面的大于它)。
2024-11-30 11:22:16
330
原创 厉害一点的排序算法
迭代只多建一个数组用于存放一轮归并后的数据,然后,角色逆转,再次归并,把新数组的数据放回原数组去,完成一轮循环。6.实现思路就是,对于一个数组,我们创建一个与它等大的数组,然后把原数组的数分成两份存进去新数组(物理上并没有拆开,逻辑上拆开了),然后对于两份数组分别递归,继续拆,直到数组只剩一个数字,merge是归并函数,它让两个数组(逻辑上两个,物理上为一个数组,因为开辟在同一块空间内)的元素比较,谁小谁放到原数组去,替换后继续比较,直到两个数组的元素全部放入数组,递归回去,原数组也就排序好了。
2024-11-30 10:07:12
579
原创 排序:简单的排序
这里的逻辑比正确的冒泡难理解,就是从第一个开始,让它与所有数字从第一个到最后一个一一比较,把小的那个交换到第一个数字的位置(显然,不断交换下去,最小的就是1),然后,重点来了,我们到第二个数字,它可能是9或者7或者任意一个不为1的数字(因为1在第一个数字的位置),把它和第一个数字比较,显然它大些,然后这个比1大就会到最前面……那么,假如我们接着碰到8怎么办,是不是拿起它根1号位的9比,小一些,不交换,后面就没有9了,2号位的数肯定小些,把8放它那里,这样下去,结果就是,987654321。
2024-11-25 20:08:17
431
原创 栈的链式存储结构及其实现
7.大家会发现栈很好理解(我敲起来也飞快)。但是,栈有什么意义呢?它似乎是个线性表的缩减版本。其实啊,栈的引入简化了我们问题,缩小了我们的关注范围,比如,线性表非常麻烦的插入和删除,到栈这里很简单,因为我们只需要关注栈顶,而现实世界中我们的很多问题恰恰是这样,只关注栈顶的,下节我们再叙……1.和线性表一样,我们介绍完顺序存储结构的栈后,发现它空间占用难以把控的问题,为了解决这些问题,我们介绍了栈的链式存储结构。4.清空栈与是否为空栈的判断。5.读取栈顶的值,压栈,弹栈。3.创建与销毁的操作。
2024-11-22 18:34:28
237
原创 栈的顺序存储结构
10.两栈共享事实上可以扩展到多栈共享,但是要明确这种数据结构适用于数据总量基本不变,几个栈之间互有盈亏的情况,也就有点像零和的那种。8.单独一个栈可能会面临空间的大量浪费,或者栈空间不足造成溢出(stackoverflow),于是前辈们想出了两栈共享空间的法子。嘿嘿,当然有,咱们下节再唠,休息咯……1.栈本质上是一种特殊的线性表,特殊在它的插入和删除发生在顶端,遵循先进先出(FIFO)的原则。6.复杂度为O(1)的插入和删除(在栈中叫压栈与弹栈)。5.不是只能看栈顶元素,其他的也可以看,与线性表相同。
2024-11-21 18:22:45
192
原创 线性表:循环链表和双向链表
1.咱们已经学习完线性表的主体内容了,接下来是一些关于线性表的改进。我们发现我们遍历线性表时总是单向的(名字也是单链表),有的时候我们为了操作方便,想要直接访问当前访问到的结点的前面一个结点。这里说下,这个双向链表的尾结点的下一个结点是头结点,头结点的上一个结点是尾结点,构成循环。7.循环链表和双链表占用内存大,但是操作简单,算法也快些,属于是用空间换时间吧。2.循环链表多了一个尾指针,指向尾部结点,而尾部结点的next指向头部结点。4.双向链表,每个结点增加了一个prior指针,头指针和尾指针放在一起。
2024-11-20 20:03:21
259
原创 线性表之静态链表
没错,就是静态链表。另外,大家注意这里没有对i的范围进行判断,有些位置是非法的,前面两节都写了,大家可以修改提升。10.事实上,我们几乎不会怎么用到静态链表,但是我们数据结构很多时候为的是能够提升对于代码性能优化的能力和思维,能起到这个作用,我相信咱们学习静态链表就是有意义的。6.这里的代码逻辑有点怪异,如果说我要插入到i位置,在这里我的代码插入后,会把i位置及i位置后的往后挤。4.初始化操作,判断是否为空的操作,清空表的操作。7.删除,嗯,大家估计都看惯了,其实逻辑上是插入的逆过程,是清空的微观。
2024-11-19 19:41:35
208
原创 线性表的链式存储结构
8.插入和删除是本次的重点,也是链式结构相较顺序结构的最大优点,大家会发现,我们现在只要找到那个位置后插入或删除就可以,算法时间复杂度为O(n),而之前我们虽然可以直接找到那个位置,但需要移动大量数据,复杂度为O(n^2)。3.利用结构体构造了单链表,这里的写法和《大话数据结构》有所不同(我是跟着大话来的),导致后面会有代码会有一点小变化,但不影响本质。4.整表的创建,分为头插法和尾插法,这个应该不难理解,后面还会有单个结点的插入,事实上就是将插入位置由特殊的头部或者尾部改成了任意位置。
2024-11-18 16:17:38
276
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1