- 博客(33)
- 资源 (10)
- 收藏
- 关注
原创 C语言优雅的实现链表
这段代码实现了一个从链表中删除指定节点的函数,使用了一种巧妙的方法。核心思想是这个函数使用了双重指针(指向指针的指针)来简化节点删除过程,避免了处理特殊情况(如删除头节点)的需要。这种实现方法被称为"优雅"是因为它用最少的代码实现了一个通用的删除操作,避免了通常在链表操作中常见的特殊情况处理。它通过返回指向节点指针的指针,为各种链表操作提供了一个统一的基础,使得诸如删除、插入等操作变得简单和一致。它能够在 O(n) 时间复杂度内完成插入操作,其中 n 是链表的长度。这是一个传统的链表删除节点方法。
2024-09-26 15:13:35
242
1
原创 多种曲线插值方法
三次插值法是最简单的方法,它能提供线段之间真正的连续性。因此,它不仅需要线段的两个端点,还需要其两侧的两个点。因此,在下面的代码中,该函数需要 4 个点,分别标记为 y0、y1、y2 和 y3。常见的解决方法是在序列的起点和终点多创建两个点,新点的斜率等于起点或终点的斜率。线性插值是获取值的最简单方法 在数据点之间的位置。Paul Breeuwsma 提出了以下系数用于更平滑的插值曲线,它使用上一点与下一点之间的斜率作为当前点的导数。所以需要更平滑的插值函数,也许是最简单的是余弦插值。
2023-12-11 10:41:55
1128
转载 一个“蝇量级”C语言协程库
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。
2023-11-14 09:48:50
207
转载 C语言字符串操作总结大全
将源串strSource开始的count个字符复制到目标串strDestination所指定的位置. 如果count值小于或等于strSource串的长度, 不会自动添加NULL结束符目标串中, 而count大于strSource串的长度时, 则将strSource用NULL结束符填充补齐count个字符, 复制到目标串中. 不能处理源串与目标串重叠的情况.函数返回strDestination值.注意:在定义字符数组1的长度时应该考虑字符数组2的长度,因为连接后新字符串的长度为两个字符串长度之和。
2023-11-14 08:49:05
502
原创 C语言的复合字面量
使用复合字面量可以直接创建匿名的结构体或数组对象,而不需要单独定义变量。需要注意的是,复合字面量创建的对象生命周期是临时的,通常要立即复制给其他变量使用,否则会被销毁。总体来说,复合字面量增强了C语言直接创建和初始化自定义对象的能力,可以编写出更简洁高效的代码。- 复合字面量可以创建结构体、数组等复合类型的匿名对象复合字面量的主要优点:- 简化创建临时对象的代码,无需定义中间变量并且可以在创建时直接初始化对象成员。复合字面量与普通字面量的区别:- 普通字面量是原始数据类型,如字符串、整型等。
2023-11-08 15:32:08
459
原创 C语言的数学和几何图形处理函数的优化
这些数学函数与标准math库相比,更注重计算效率,函数使用了一些计算机图形学常见的技巧,例如快速逼近、位操作、查表等,数学计算上做了优化,比通用的math库能获得更高的计算性能。更注重易用性,提供了更直接简单的函数接口,如nk_inv_sqrt直接返回平方根的倒数,而不是像标准库那样需要组合多个函数调用。更具特定性nk中的函数更针对图形界面开发的特定需求,提供了math库中没有的一些专门函数,如nk_rect系列。3. nk_round_up_pow2 - 计算不小于指定值的2的幂。
2023-09-27 08:54:16
122
原创 C语言中关于realloc()的思考
就是申请更大的内存地址,把原有的数据拷贝过去,销毁原有的。那么,看到realloc的特性之后,realloc总是会首先试图追加内存空间,这就避免复制销毁的开销提高了性能。1. 如果size比原来的内存块大,则为内存块分配一个新的、更大的内存空间,并将原来内存块中的数据拷贝到新的空间中,最后返回新内存块的指针。- ptr: 要调整大小的内存块指针,该指针必须是由之前的malloc/calloc等分配得到。2. 如果size比原内存块小,则直接缩小内存块的大小,并返回同样的内存块指针。还是需要自己维护的。
2023-08-26 14:47:08
165
原创 C语言的链式调用
这里append()方法会返回StringBuilder对象本身,所以可以继续调用append()方法,形成链式调用的效果。在C语言中,可以通过返回对象指针来实现链式调用,主要思路是:- 每个方法执行操作后,返回对象本身的指针。所以链式调用是一种编程技巧,可以让代码更加可读和优雅,在C语言中也可以通过返回指针来实现。它的主要思想是,把多个方法调用链式连接起来,一个方法的返回值可以当作下一个方法的参数。MyObject_print() 打印num关键是每个方法在执行操作后,都返回对象本身的指针。
2023-08-26 13:58:54
494
原创 C语言关于协程的探究
协程是一种用户级的轻量级线程,它可以在单线程里多个函数并发地执行协程,可以在主任务进行的同时,执行一些分支任务,以协助程序达到最终的效果,我们可以将协程成为用户态线程,但它与线程又有所区别。这样,通过使用函数指针和上下文结构体保存各协程的执行信息,并在scheduler中进行切换,实现了简单的协程执行效果。这个程序定义了一个上下文结构体Context表示一个协程,scheduler函数作为协程调度器,它会根据当前的cid来选择并执行一个协程函数。6. 采用抢占式协程调度,协程函数无需显式切换。
2023-06-30 10:20:24
259
原创 用C语言实现try cash --《Implementing Exceptions in C》
异常可以从函数内部的抛出,并且跳过了–i这一句,所以最终i的值为1,并且运行了FINALLY语句块后继续抛出,并被EXCEPT(e)语句块捕获,然后成功获得了异常信息。Exceptions.c文件源码。Exceptions.h文件源码。test.c测试函数。
2023-06-29 17:26:22
146
原创 C语言的泛型模板
因为第一个参数 a 是 int,所以选择 swap_int,而第一个参数 c 是 float,所以选择 swap_float。所以 _Generic 泛型宏可以支持参数类型不同的情况,它会根据第一个参数的类型来选择对应的实现。泛型宏允许根据参数类型生成不同的代码。在这个定义中,如果 a 是 int 类型,那么选择 swap_int,如果 a 是 float 类型,那么选择 swap_float,否则选择 swap_double。使用 _Generic 关键字定义的泛型宏,其参数类型是可以不同的。
2023-06-08 15:02:02
397
原创 通过函数指针来实现外部程序访问
众所周知单片机的程序一般是运行在内部flash上的,然而内部一般是不允许外部访问的,当那么当你想通过单片机访问外部程序该怎么实现呢。最好的办法是通过XIP来跳转到外部flash上运行成外部程序,但是XIP需要MCU支持,所以这个方法下次讨论。不支持XIP的芯片的话,我们想到把程序搬运到RAM里面运行是否可行呢?首先我们需要规划一片区域,禁止其他程序访问,把我们需要的外部程序搬运在此位置。以便固件查找运行,那么怎么规划一片区域呢,此时我们需要用到KEIL上的一个叫(分散加载...
2022-05-20 17:05:55
413
原创 LVGL加载外部flash上图片
void loadBitmap(lv_img_dsc_t *image, uint32_t start_addr, uint32_t file_size){ uint8_t *pbuf; //读取数据缓冲区 uint8_t *pbmp; uint32_t header; int secTime = file_size/4096; int secOff = file_size%4096; int i; dbg_printf(" secTi...
2022-04-06 17:34:02
5261
7
原创 STM32 HAL库MSC 通过STM32内部Flash实现模拟U盘的功能
STM32 HAL库MSC 通过STM32内部Flash实现模拟U盘的功能。1.配置STM32Cubemx软件生成工程选择stm32F103RCTx配置好系统时钟,选择USB_DEVICE ,Mass Storage Class(大容量存储设备)2.生成工程打开
2020-12-25 16:44:13
2900
4
原创 TCP和UDP的区别
TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作; UDP具有较好的实时性,工作效率较TCP协议高; UDP段结构比TCP的段结构简单,因此网络开...
2018-08-02 11:28:01
192
转载 I/O重定向的原理和实现
2015年03月29日 15:51:16阅读数:2192文章出处:http://www.cnblogs.com/weidagang2046/p/io-redirection.html 在Unix系统中,每个进程都有STDIN、STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式。几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从...
2018-07-29 10:22:37
1237
转载 select函数详解
在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还是关注一个描述符中是否出现异常) •我们要等待多长时间。(我们可以等待无限长的时间,等待固定的一段时间,或者根本就不等待) 从 selec...
2018-07-28 10:00:03
201
原创 exec函数组的用法
exec函数组 在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)。 fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被 exec 执行的进程的PID不会改变(和调用exec的进程的PID一样)。在Linux中,并不存在exec()函数,exec指...
2018-07-26 10:10:08
676
原创 C语言之函数
函数(Function)0.引言 算法的结构化设计 标准函数(库函数)和自定义函数 程序从main函数开始,在main函数结束 main函数可以调用其他函数,但是其他函数不能调用main函数,main函数是系统调用的。————————————————————————————————————————————————————————————————————————————————————1.有参函数和...
2018-03-07 16:53:43
124
原创 C语言之循环结构
循环结构1.三种循环语句 while 一般形式为 while(表达式) 语句 一般表达式是循环条件 ,语句是循环体 eg1: 求1-100 的和 #include<stdio.h> int main(int argc,char *argv[]) { int sum = 0; int i = 1; /* while(i <= 100) { ...
2018-03-07 16:48:46
679
原创 C语言之选择结构
选择结构(分支结构)1.关系运算符及其表达式 关系运算符:在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作,比较两个量的运算符就称为 ~ < <= >= > 优先级高 == != 优先级 算术运算符 > 关系运算符 > 赋值运算符 结合性 从左到右 a + b > c - d (a + b) > (c - d) x > 3...
2018-03-07 16:37:02
1131
原创 C语言之数据类型
1.基本数据类型 C语言中包含整型、浮点型、和字符型三种数据类型。 1)整型:十进制整数形式如 1,123,412。 从有无符号来说,整型包含无符号型(unsigned)和有符号型(signed可以省略) 从字节数来说,整型包含short型(2字节),int型(4字节),long型(4字节) 2)字符型:单引号括起来的一...
2018-03-04 10:50:25
925
padshelperv2.7.rar
2020-04-15
stm32f10x中文固件库手册
2018-08-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人