排序算法
冒泡排序外循环–,内循环 ++(从后往前排好) #include <stdio.h> #include <stdbool.h> #define DATA_SIZE 15 int bubble_sort(int *data, int len) { int temp; bool swap_flag = true; for (int i = len - 1; i > 0; i--) { // NOTE:NUN个数要比较NUM-1次,//后面先排好 swap_flag = false; for (int j = 0; j < i; j++) { // NOTE:大的数放到后面,小的数放到前面,i之后的已经排好,i之前的需要排序 if (data[j] > data[j + 1]) { temp = data[j]; data[j] = data[j + 1]; ...
CMake
注释用 # 已有宏PROJECT_SOURCE_DIR使用 cmake 命令后紧跟的目录,一般是工程的根目录 CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 所在的路径 EXECUTABLE_OUTPUT_PATH用来指定生成文件路径,如果不存在该路径则会创建 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/output) 搜索aux_source_directory查找某个路径下的所有源文件 aux_source_directory(< dir > < variable >) aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST) dir:要搜索的目录variable:将从 dir 目录下搜索到的源文件列表存储到该变量中 filefile(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型) file(GLOB MAIN_SRC ${...
vim
vi/vim 的使用基本上 vi/vim 共分为三种模式,命令模式(Command Mode)、输入模式(Insert Mode)和命令行模式(Command-Line Mode)。 命令模式用户刚刚启动 vi/vim,便进入了命令模式。 此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。 以下是普通模式常用的几个命令: i – 切换到输入模式,在光标当前位置开始输入文本。 x – 删除当前光标所在处的字符。 : – 切换到底线命令模式,以在最底一行输入命令。 a – 进入插入模式,在光标下一个位置开始输入文本。 o:在当前行的下方插入一个新行,并进入插入模式。 O – 在当前行的上方插入一个新行,并进入插入模式。 dd – 剪切当前行。 yy – 复制当前行。 p(小写) – 粘贴剪贴板内容到光标下方。 P(大写)– 粘贴剪贴板内容到光标上方。 u – 撤销上一次操作。 Ctrl + r – 重做上一次撤销的操作。 :w – 保存文件。 :q – 退出 Vim 编辑器。 :...
makefile
makefile 是从下往上执行的 第一行语法为 all 的话,make 时默认 make all 若不交叉编译,则不设置 CC 即可 基本概念Makefile 是 make 命令所读取的配置文件,包含了构建项目的规则。其主要作用是检查项目文件的依赖关系,自动执行必要的命令,从而更新目标文件。一般来说,Makefile 主要包括以下三部分内容: 目标(Target):需要生成的文件,例如可执行文件。依赖(Dependencies):生成目标所依赖的文件或目标。命令(Commands):构建目标时需要执行的命令。 基本语法target:目标文件,可以是一个目标文件或一个动作名称(伪目标)(例如:all, clean)。dependencies:生成目标所依赖的文件或其他目标。command:构建目标的命令,必须以 Tab 键开头。 target: dependencies command 工作原理make 会根据 Makefile 中的规则,依次检查目标文件的时间戳和依赖文件的时间戳。如果依赖文件的时间戳比目标文件新,或者目标文件不存在,make 就会执行对应的命令来...
柔性数组
柔性数组的定义柔性数组必须是结构体的最后一个成员,且不能指定大小: struct flex_array { int length; // 用于记录数组元素数量 int data[]; // 柔性数组,不指定大小 }; 柔性数组的特点 柔性数组只能作为结构体的最后一个成员 柔性数组不占用结构体的存储空间 通过结构体指针访问柔性数组 需要动态分配内存来使用柔性数组 使用示例#include <stdio.h> #include <stdlib.h> #include <string.h> // 定义包含柔性数组的结构体 struct flex_buffer { size_t size; // 缓冲区大小 char data[]; // 柔性数组 }; // 创建一个柔性数组缓冲区 struct flex_buffer* create_buffer(size_t size) { // 分配内存:结构体大...
如何确保 32 位系统和 64 位系统的代码兼容性
数据类型选择 避免使用固定大小的类型(如 int),改用跨平台的精确宽度类型(如 int32_t、uint64_t 等 C/C++ 中的 stdint.h 定义类型) 注意指针大小差异:32 位系统指针为 4 字节,64 位为 8 字节,避免将指针强制转换为 int 等固定大小类型 内存处理 计算内存大小时使用 sizeof()而非硬编码数值 注意数组索引和偏移量计算,避免因指针大小变化导致越界 序列化/反序列化数据时明确指定类型大小,避免跨平台传输错误 常量与宏定义 避免使用依赖于系统位数的常量(如 0xFFFFFFFF 作为掩码在 32 位是全 1,64 位则不是) 使用条件编译区分不同架构(如 C/C++ 中的 #ifdef _WIN64 或 #ifdef __x86_64__) 函数与库调用 注意库函数的参数和返回值类型是否与系统位数相关 确保链接正确版本的库文件(32 位/64 位库不能混用) 对于 Windows API,注意使用正确的数据类型(如 HANDLE 在 64 位系统是 64 位) 文件格式与网络协议 处理文...
LoRa
特点 远距离在乡村地区能以长达 30 英里的距离为间隔连接设备,可穿透建筑物密集的市区或进深较长的室内环境。 低功耗仅需极少能源,电池使用寿命长达 10 年,将电池更换成本降到最低。 关键参数 载波频率LoRa 的工作频率。范围在 410MHz-493MHz。典型值 433MHz,470MHz,490MHz。 发射功率发射功率越大,信号能传输的距离就越远。我们的模块最大发射功率可以到 22dbm。dBm 是分贝毫瓦(decibel-milliwatts)的缩写,是一个基于对数的单位,用于表示功率相对于 1 毫瓦(mW)的级别。 空中速率LoRa 的“空中速率”(也称为“空中数据速率”或“无线数据速率”)指的是 LoRa 系统在无线空中接口上实现的数据传输速率。这个速率是指在 LoRa 通信中,数据以多快的速度通过空中从一个设备传输到另一个设备。空中速率受多种因素影响,包括**扩频因子(Spreading Factor, SF)、带宽(Bandwidth)、编码率(Coding Rate)等。 扩频因子(SF)扩频因子决定了每个比特的信息是如何通过多个被称为“码片”(chirps...
CPP兼容性问题分析
现象描述若导出的 API 使用了 C++ 标准库类型(如 std::vector、std::map、std::string、std::shared_ptr 等),在不同编译环境、编译器、标准库版本 .so 调用时可能出现编译、链接或运行时异常,主要表现为: 链接符号未定义(undefined symbol)模板实例化或类型信息不一致导致崩溃接口数据结构错乱、内存访问异常结构体成员内容失真,数据读取错误 ABI 与 API 的区别API(应用编程接口):即头文件中的接口、类型和函数声明,描述了编译器和程序员可以用来编程的内容。 ABI(应用二进制接口):是编译后实体(如对象布局、名称修饰、虚表等)的具体二进制格式,决定不同二进制模块(如动态库、应用)之间能否兼容并联动。 库 API + 编译器 ABI = 库 ABI不同编译器(或同一编译器的不同版本/不同参数)生成的 ABI 规则可能不同,同样的 API 编译出来二进制层面可能不兼容。只有库 API 和编译 ABI 规范都一致,最终的库 ABI 才和应用程序期待的一致。二者只要有一方不一致,库 ABI 就...
为何我开始写博客
这是我个人博客的起点。我相信“输出是最好的输入”,在学习和工作的过程中,零散的笔记难以形成体系。 因此,我决定搭建这个博客,系统地记录我的技术探索、学习心得和生活中的点滴思考。 希望这里的文字能帮助未来的自己回顾成长。
