- 博客(28)
- 收藏
- 关注
原创 散列表(哈希表)
散列表(hash table,又称哈希表),是一种数据集,其中数据项的存储方式尤其有利于将来快速的查找定位。散列表的基本思想是,首先在关键字key和存储位置p之间建立一个对应关系H,使得p = H(key),H称为哈希函数,p称为散列地址。当创建哈希表时,把关键字key的记录直接存入地址为H(key)的地址单元中;以后查找关键字为key的元素时,再利用哈希函数p = H(key)计算出该元素的散列地址p,从而达到直接存取记录的目的。
2025-07-25 21:09:25
689
原创 数据结构堆的实现(C语言)
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:1、堆中某个结点的值总是不大于或不小于其父结点的值。2、堆总是一棵完全二叉树。建议不了解完全二叉树概念的先去学一下完全二叉树。根结点的值最大的堆叫做大根堆或者最大堆,根结点的值最小的堆叫做小根堆或者最小堆。堆是一种非线性结构,是完全二叉树的一种特殊形式,他符合完全二叉树的所有性质。
2025-07-21 21:36:39
841
原创 宏函数(函数式宏)
从上面可以看到函数式宏在某些时候可以替代函数的作用,它们的区别如下:函数式宏是在编译时展开并填入程序的,而函数定义则需要为每个形参都定义各自的数据类型,返回值类型也只能为一种。函数更为严格。函数默默的为我们进行一些复杂的操作,比如:参数传递(将实参值赋值给形参),函数调用和函数返回操作,返回值的传递;而函数式宏只是做宏展开,并不做上述处理。函数式宏能使程序的运行速度提高,但是当函数中有大量的宏替换的时候,又会使得程序变得臃肿。
2025-07-21 12:08:13
578
原创 关于内存对齐的介绍
内存对齐是数据在内存中的存储规则,要求数据的起始地址必须是对齐系数的整数倍,简单来说,就是方便计算机去读写数据。对齐的地址一般都是 n(n = 2、4、8)的倍数。(1)1 个字节的变量,例如 char 类型的变量,放在任意地址的位置上;(2)2 个字节的变量,例如 short 类型的变量,放在 2 的整数倍的地址上;(3)4 个字节的变量,例如 float、int 类型的变量,放在 4 的整数倍地址上;
2025-07-19 10:15:33
828
原创 static、volatile、const关键字
static中文字意是静态的,用于控制变量和函数的作用域、生命周期和可见性等,修饰变量和函数,将其变成静态变量/函数。static总体来说有以下作用:1、在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。2、在声明变量时,变量具有静态持续时间,并且除非您指定另一个值。3、在全局和命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。
2025-07-18 03:00:00
650
原创 数据结构队列的实现(C语言)
顺序队列的底层存储结构是数组,是利用数组依次存放数据元素实现的。设置两个指示器,front指向队列头元素下标,rear指向队列尾元素下标或者尾元素的下一个位置(也就是下一个数据的插入位置)。//指向队头//指向队尾的后一个元素}SeQueue;在初始化时,队列是空的状态,队首队尾都是0.在不考虑溢出和队空的情况下,入队使队尾指示器后移,出队使队头指示器后移。
2025-07-14 09:00:00
876
原创 数据结构栈的实现(C语言)
数组栈的结构体可以定义为以下形式,数组栈在定义时就需要设置好大小,因为数组无法动态分配内存。//以int类型数据为例int index;//栈顶地址}stack;在初始化空栈时,将index设置为-1。stack sk;链栈的结构体要先定义一个链表,再定义一个栈结构体,使其top指向链表的头结点。}Node;}stack;初始化也是先构造一个空链表,再使栈顶指向链表头结点,此处选用的链表是有头结点的,也可以省去头结点,使栈顶直接指向首元结点。//定义一个链表//定义栈顶指针。
2025-07-13 15:35:12
984
原创 Linux系统中摄像头的使用(V4L2框架)
市面上有非常多型号的摄像头,各个摄像头的结构,性能各不相同,如果每个摄像头的使用程序各不相同,就对Linux的应用层开发造成了很大限制,更换一个摄像头就要重新写一遍程序,而V4L2框架就很好了解决了这个问题,V4L2(Video for Linux 2)是Linux内核中用于管理视频设备的标准化驱动框架,为上层应用程序提供统一的编程接口(如ioctl系统调用),支持各类视频输入,使得应用层开发中不必纠结摄像头的底层驱动方法,通过V4L2的API即可使用各种不同型号、品牌的摄像头。
2025-06-13 15:49:58
1397
原创 Linux应用开发之I/O多路复用
/最大可监视十个文件描述符//ev是epoll_ctl用于添加、设置文件描述符的events//events是epoll_wait时用于承接返回值,使用数组承接多个返回值int fd;//要监视的文件描述符//指向epoll实例的文件描述符int nfds;//接收就绪的文件描述符数量//设置为监视输入和边沿触发//不阻塞用于监视文件描述符是否就绪//返回值是已经就绪的文件描述符数量,返回0代表超时也没有文件描述符就绪,就绪的文件描述符的信息。
2025-06-12 16:37:56
1121
1
原创 Linux应用开发之进程间通信
上述共介绍了四种进程间的通信方式,分别为匿名管道,有名管道,共享内存和消息队列,其中匿名管道只能用于父子进程间的通信,因为其只能通过创建的文件描述符进行通信,只有父子进程之间可以继承到,其他进程无法获取到相关的资源。其余三种通信方式既可用于父子进程通信,也可以用作任何两个进程间的通信,因为他们都拥有一个唯一标识,会创建一个临时文件用于进程访问。还有另外一种可以用于进程间的通信方式,套接字,套接字一般用于网络通信,后续演变为进程间的一种通信方式,本文暂时不做介绍。
2025-06-11 10:24:42
1146
原创 Linux应用开发之网络套接字编程(实例篇)
服务端的编程顺序是初始化地址,给地址赋值,创建套接字,绑定套接字,进入监听模式,接受连接(会返回客户端的套接字和地址),发送/接收数据,unlink释放套接字。客户端的编程顺序是初始化地址,给地址赋值,创建套接字,连接客户端,发送/接收数据。除此之外,服务端和客户端的程序编写流程和TCP并无区别。和多线程不同的是,我们发现两个客户端的文件描述符是相同的,这是因为accept在父进程进行,数据传输的任务在子进程执行,父进程不需要使用客户端的文件描述符,所以已经将其关闭了,进而导致下一次返回的文件描述符相同。
2025-06-09 16:16:44
2086
1
原创 Linux应用开发之网络套接字编程(理论篇)
套接字(Socket)是计算机网络数据通信的基本概念和编程接口,允许不同主机上的进程(运行中的程序)通过网络进行数据交换。它为应用层软件提供了发送和接收数据的能力,使得开发者可以在不用深入了解底层网络细节的情况下进行网络编程,屏蔽了应用程序对底层协议的操作,使得应用程序使用网络进行数据传输变得更简便,使代码更容易维护。socket英文直译为“插座”,可以理解为应用层调用网络服务的接口。套接字主要由以下三个属性组成:网络地址:通常是IP地址,用于标识网络上的设备。端口号:用于标识设备上的特定应用或进程。
2025-05-29 16:38:48
1121
原创 Linux线程同步之条件变量和信号量
本文系统介绍了线程同步机制中的条件变量和信号量。条件变量部分详细讲解了其工作原理及核心函数,包括pthread_cond_wait、pthread_cond_signal等,并附有示例代码演示线程同步实现。信号量部分区分了二进制信号量和计数信号量的应用场景,对比了有名信号量和无名信号量的特点及其API函数(如sem_init、sem_open等)。通过多个实际代码案例,展示了信号量在线程间和进程间同步的具体应用。全文最后总结了两种同步机制的选择原则和注意事项,为开发多线程/多进程程序提供了实用参考。
2025-05-27 11:36:59
1508
5
原创 Linux线程同步中的锁机制
当多个线程并发访问和修改同一个共享资源(如全局变量)时,如果没有适当的同步措施,就会遇到线程同步问题。这种情况下,程序最终的结果依赖于线程执行的具体时序,导致了竞态条件。竞态条件(race condition)是一种特定的线程同步问题,指的是两个或者以上进程或者线程并发执行时,其最终的结果依赖于进程或者线程执行的精确时序。它会导致程序的行为和输出超出预期,因为共享资源的最终状态取决于线程执行的顺序和时机。为了确保程序执行结果的正确性和预期一致,需要通过适当的线程同步机制来避免竞态条件。
2025-05-22 11:39:24
913
3
原创 Linux线程的创建、退出、线程池
Linux 中的线程是指轻量级的执行单元,相比于进程,具有以下特点:进程(Process)是正在执行的程序的实例。每个进程都有自己的地址空间、代码段、数据段和打开的文件描述符等资源。线程(Thread)是进程内的一个执行单元,它共享相同的地址空间和其他资源,包括文件描述符、信号处理等,但每个线程都有自己的栈空间。由于共享地址空间和数据段,同一进程的多线程之间进行数据交换比进程间通信方便很多,但也由此带来线程同步问题。同一进程的多线程共享大部分资源,除了每个线程独立的栈空间。
2025-05-21 13:35:53
881
原创 Linux应用开发之进程处理
上述共介绍了四种进程间的通信方式,分别为匿名管道,有名管道,共享内存和消息队列,其中匿名管道只能用于父子进程间的通信,因为其只能通过创建的文件描述符进行通信,只有父子进程之间可以继承到,其他进程无法获取到相关的资源。其余三种通信方式既可用于父子进程通信,也可以用作任何两个进程间的通信,因为他们都拥有一个唯一标识,会创建一个临时文件用于进程访问。还有另外一种可以用于进程间的通信方式,套接字,套接字一般用于网络通信,后续演变为进程间的一种通信方式,本文暂时不做介绍。
2025-05-20 17:24:36
1088
原创 C语言实现单/双向链表
单链表是每个元素多用一个位置来存放指向下一个元素的位置的指针。这样子从第一个元素可以找到第二个元素,第二个元素可以找到第三个元素,依此类推,所有的元素我们就都可以通过遍历而找到了。链式存储结构的元素除了要存储本身的值之外,还要存储一个指向后续元素的指针,这就是单链表,双链表多了一个指向上一个元素的指针。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为结点(Node)。
2025-05-16 23:14:43
754
1
原创 Linux应用层开发之文件I/O
fopen函数的原型为作用是打开一个文件并返回其文件指针。参数1:const char *__restrict __filename:表示打开的文件的路径,可以写相对路径/绝对路径参数2:const char *__restrict __modes:表示打开文件的方式,有读/写/追加写等(1)"r": 只读模式 没有文件打开失败(2)"w": 只写模式 若存在文件则会清空文件,不存在文件则创建新文件(3)"a": 只追加写模式 不会覆盖原有内容 新内容写到末尾,如果文件不存在则创建。
2025-05-16 15:42:25
901
1
原创 C++STL-list
list是C++的一个序列容器,插入和删除元素的效率较高,时间复杂度为常数级别,list容器的底层数据结构为带头双向循环链表,这使得 list的元素可以存储在非相邻的内存中,在list内部,不同元素之间通过指向前一个元素的指针以及指向后一个元素的指针相关联。删除迭代器iterator1指向的元素到iterator2指向元素之间的元素 包括iterator1指向的元素但不包括iterator2指向的元素,即擦除[iterator1,iterator2)。元素被插入到 iterator_pos指向的元素之前。
2025-05-13 16:38:17
599
原创 C++STL-set
头文件<set>包含set和multiset两种容器,分别是“有序集合”和“有序多重集合”,有序集合中的元素不可重复,有序多重集合可以包含多个相等的元素,两者都会将元素按从小到大的顺序排列。= / *解引用操作。查找set中值为data的元素的个数,由于set中元素各不相同,所以和find方法的效果类似(用于判断是否存在),存在返回true,不存在返回false。返回容器当前的大小(元素个数),set容器没有resize方法,因为元素各不相同,不允许重复,如果设置的大小大于当前容量,则多余的元素无法赋值。
2025-05-12 21:35:30
353
原创 C++STL-vector
vector在内存中以连续块存储元素,支持通过下标快速访问(时间复杂度为O(1))和修改,但使用下标修改的时间复杂度较高,一般采用尾部插入数据的方式,与静态数组不同,它可动态调整大小,自动处理内存分配与释放。赋值p为指向头部元素的迭代器,每次使p++,移动到了下一个元素,每次对p解引用可以得到当前位置元素的值,当p迭代到vec.end()时停止迭代。定义一个名为vec的vector类型容器,大小为m,各元素的值初始化为0。定义一个名为vec的vector类型容器,大小为m,各元素的值初始化为n。
2025-05-12 18:02:00
825
原创 stm32实现正弦、方波、三角波的波形识别
正弦波作为最基础的波形,可以组合产生任意波形,只包含一个和自己同频率的基波,不包含其他任何谐波分量,频谱图如下由于我使用的是复数傅里叶变换,所以频谱会有对称的现象。可以看到只包含一个频率分量也就是基波分量方波和三角波都是奇谐信号,只包含奇次谐波分量如三次、五次谐波,方波的基波幅度是三次谐波的三倍,三角波的基波幅度是三次谐波的九倍。而正弦波不包含谐波分量,这就是频谱法判断波形的关键。我们可以将傅里叶变换之后得到的基波幅度和三次谐波的幅度做比值,通过比值的大小即可判断不同的波形。
2025-04-11 18:03:57
1702
原创 STM32测量相位差
通道号,采样时间等可自由设置,采样时间可适当延长,要注意ADC频率和触发频率的关系,ADC采样一次要花费的时钟周期数为ADC位数+采样时间,触发频率不能高于ADC的时钟频率/采样一次花费的周期数,所以采样时间不可过长。2.将 ADC 设置为同步模式,本次选择常规同步模式,这样主 ADC 触发采样后,从ADC也会。开启两个 ADC 后,在哪个 ADC 的 MODE 中选择同步模式,哪个就是主 ADC,另。的相位差且采样到的信号保持原始相位。是主 ADC 的采样数据,高 16 位是从 ADC 的采样数据。
2025-04-11 15:30:18
1179
2
原创 stm32的fir滤波器实现
本图中为低通滤波器,可以看到低于Fc=10800Hz的信号在经过该滤波器之后,其幅值并没有变化,高于10800Hz的信号在经过之后,幅值有非常大的衰减,也就是高于10800Hz的信号被滤除了。输入信号为粉色,5KHz的方波,其基波为5KHz的正弦,可以看到绿色信号是滤波之后留下的5KHz正弦波,其余谐波均高于10800Hz,已经被滤除。设计好滤波器之后,点击上方的目标-生成C头文件,导出为单精度浮点,就可以得到一个包含滤波器系数的h文件,将其复制到stm32的代码中使用。样也是显示频域特性的方法。
2025-04-11 15:08:31
1186
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人