
C语言
shadow3D
嵌入式开发
展开
-
J-Link RTT 支持浮点数
RTT添加浮点数功能原创 2022-11-14 14:59:16 · 820 阅读 · 0 评论 -
复杂的“Hello World!“
分析一个复杂的”hello world"程序原创 2022-10-09 23:02:35 · 291 阅读 · 0 评论 -
常见排序算法
*稳定排序算法:对于值相同的元素经过排序后其顺序和输入一样的算法。不稳定排序算法即值相同的元素排序后顺序发生变化。当数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时,稳定排序算法就很重要了。1. 冒泡排序 第一次循环找出最大值,第二次循环找出第二大的值。。。直到找到最后一个。2. 插入排序 先将前面 i ( 1 <= i <= N) 个元素排序,然后将第 (i+1) 个元素插入到 前面 i 个有序序列中。// ...原创 2021-01-05 14:39:09 · 155 阅读 · 0 评论 -
C 语言代码总结
/*************************************************************************** * 正确在调试过程中打印调试信息的方法 */ #include <stdio.h>#define Lin_Dbg // 可以在编译时用 gcc -Wall -DLin_Dbg main.c 代替#ifdef Lin_Dbg #define PDBG(fmt, args...) printf("Dbg: ..原创 2020-12-04 00:44:13 · 237 阅读 · 0 评论 -
C语言宏定义中的 “#” 和 “##”
#include <stdio.h>// #(stringizing) 字符串化操作符。// 作用:将宏定义中的传入参数名转换成用一对双引号括起来的参数名字符串。// 其只能用于有参数传入的宏定义中,且必须置于宏定义参数名前面。 // 对空格的处理:// 1. 忽略传入参数名前后的空格;// 2. 当传入参数名的中间存在空格时,编译器会自动连接各子字符串,// 且每个子字符串中只以一个空格连接,忽略多余一个的空格。 #define EXP(x) printf(".原创 2020-11-30 10:21:40 · 1711 阅读 · 0 评论 -
函数指针
(*(void(*)())0)(); void(*)() // 这就是一个没有名字的函数指针*(void(*)())0 // 这里可以看成 *(xx)0 的形式,其中 () 是类型转换符 // 所以这里的执行顺序应该是 *( (void(*)())0 ) // 所以这里是将数字 0 转换为函数的指针类型 // 及这个没有名字的函数指针指向一个地址...原创 2020-11-18 17:04:58 · 144 阅读 · 1 评论 -
C语言 代码片段
#include <stdio.h> int main(void) { union V { struct X { unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; } x; unsigned char c; } v; v.c = 100; // 输出如下: (小端机器,即小地址放小字节数据) printf("s1 = %d\n", v.x.s1); // 0 p.原创 2020-11-13 12:55:53 · 547 阅读 · 0 评论 -
宏定义中 ## 和 # 的作用
## 的作用是把前后两个 token 连接起来。 eg: #define f(a,b) a##b# 的作用是把后边的 token 变成字符串。 eg: #define s(a) #a注意:## 连接前后两个数字的时候表现正常,但连接两个字符串时,在 GCC 下编译出错,则把 ## 用空格代替就好。 eg: #define f(a,b) (a b)#include<stdio.h>#define f1(a,b) a##b#define f...原创 2020-11-09 00:25:09 · 194 阅读 · 0 评论 -
2020-11-05
区别:https://www.geeksforgeeks.org/difference-getchar-getch-getc-getche/int getc(FILE *stream); 标准库函数,头文件:stdio.h功能:返回stream流的下一个字符,返回类型为unsigned char(被转换为int)。如果遇到文件结尾或发生错误,返回EOF。利用getc()捕获字符时,字符会回显在屏幕上,且输入直到按下回车才结束,当stream是stdin时,和getc...原创 2020-11-05 18:24:21 · 152 阅读 · 0 评论 -
HAL库中同时实现微秒级us以及毫秒级ms延时
HAL库要实现毫秒延时很简单,直接调用HAL_Delay();延时函数就可以了。(这个函数每隔1ms就会产生一次中断)但是,要实现微秒的话。。。貌似就没有现成的方法了。所以我这边通过基础定时器Timer6,通过轮询的方式实现微秒级延时。(对于微秒级延时,如果通过中断方式实现会导致过于频繁的进入中断,干扰其他中断的及时响应)首先在STM32CubeMx中打开Timer6并按如下方式配置:(timer6时钟是72M)注意,在NVIC Settings中的中断是不需要使能的:然后生成代码,原创 2020-10-14 13:05:32 · 6577 阅读 · 9 评论 -
队列的实现——C语言
// C语言,队列的实现#include<stdio.h>#include<stdlib.h>#define QUEUE_SIZE (50) // 设置队列的大小typedef struct SeqQueue{ int data[QUEUE_SIZE]; // 队列元素 int front; // 队列的头 int rear; // 队列的尾 int count; // 队列当前的元素个数}Queue;Queue *InitQueue(){ .原创 2020-05-20 17:39:25 · 231 阅读 · 0 评论 -
牛顿迭代法求平方根
// 说明:以下用到的 [] 表示下标,比如X[0]就是X0// 计算n的平方根x,就是找一个x值使其满足 x*x=n ,也就是求 f(x)=x*x-n 这个二次方程的解。// 假设先另 x=x[0] (且 x[0]≠0 ),如果x[0]不是解,则做一条经过 (x[0],f(x[0])) 这个点的切线,那这条切线必然和X轴有一个交点x[1]// 同样,如果x[1]不是解,再经过 (x[1],f(x[1])) 这个点做切线,得到和X轴的交点x[2] ...// 这样一直做切线,得到的x[i]会越来越.原创 2020-05-15 18:26:10 · 426 阅读 · 0 评论 -
内存泄漏问题
#include<stdio.h>#include<stdlib.h>int main(void){ int *p = (int *) malloc(10*sizeof(int)); p++; free(p); return 0;}// 如果加上p++;这行,编译和运行都没问题,但是程序运行时间会大大增加。// 释放改动后的动态指针行为是未定义的。// 详情请参考:https://www.zhihu.com/question/41...原创 2020-05-12 18:36:18 · 201 阅读 · 0 评论