自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(190)
  • 收藏
  • 关注

原创 表驱动编程实战:让 UI 逻辑既清晰又好维护

表驱动的核心思想是:把一系列相似逻辑的“变化点”抽成配置表,用结构体/数组描述。程序运行时,统一遍历这张“表”,调用通用逻辑处理每一条配置。减少重复:逻辑只写一次。修改成本低:改配置就能改变表现,不动代码。更易扩展:新增场景只需加配置项。这跟剧情脚本、配置驱动 UI、状态机表等思路一致,只是我们在普通 C++ 代码里应用它。

2025-11-17 20:00:33 197

原创 一次曲线控件重构实战:从业务耦合到通用组件

不要一上来就推倒重写:先稳定接口,再替换实现,给自己留回退空间;把业务逻辑上移,把 widget 当成真正的“控件”用业务层负责:取数 + 计算 + 选 style;控件层负责:根据 series + style 画图;通过 ViewState/LineSeries/LineStyle 这样的数据结构,把隐形知识显式化,之后再优化或迁移就简单很多;Theme/Color/Style 单独抽象,可以让项目的 UI 风格更容易统一和演进。

2025-11-17 09:39:49 892

原创 优化与重构:大改之前要先理清架构

这套指导思想本质上是业界常见的一些经验(重构优先、接口稳定、增量演进、可回滚),我帮你结合你现在的车机曲线项目,换成了更接地气的版本。“我有没有先把角色、接口、调用方都理清楚?

2025-11-17 09:38:57 314

原创 车机项目中的 Widget 设计反思:从“能用”到“好用”的改进方向

目前widget控件承担了视图 + 业务 + 数据访问 多重职责;魔法数字和枚举下标增加了理解和修改成本;日夜模式、颜色策略等横切逻辑在很多地方重复实现。改进方向可以概括为四个关键词:解耦:业务逻辑上移,widget 专注绘制;抽象:用 ViewState、枚举常量、ThemeHelper 抽掉重复逻辑;规范:统一控件接口、去除魔法数字和#if 0;渐进:从新功能和局部修改入手,避免大范围一次性重写。

2025-11-17 09:38:01 435

原创 C/C++ 整数字面量后缀全解析:U、L、UL + 项目实战坑点总结

面向已经在写实际 C/C++ 工程(尤其是车机、嵌入式、UI)的同学。目标:搞清楚整数字面量后缀到底有什么用、什么时候必须写、实际项目里有哪些坑。10 // 默认整型,通常是 int10U // unsigned int(无符号)告诉编译器,这个“数字常量”应该是什么整型类型。不写后缀时,编译器按一套规则自动推断类型,例如:先尝试int,装得下就用int;装不下再尝试long,再不行用long long。Uu:无符号(unsigned)Ll:longLLll:long long。

2025-11-16 17:35:13 833

原创 C++ 中的继承与组合

是的子类(继承关系,is-a)。MenuWindow只是“拥有多个 MenuSubWindow 子类实例”的容器(组合关系,has-a)。析构函数和上的override,都是在和BaseWindow建立重写关系,跟MenuWindow无关。

2025-11-16 17:16:49 770

原创 C++ Lambda 表达式实战入门与进阶

不用跑到文件上方去写一堆。

2025-11-16 16:59:59 646

原创 车辆状态界面这部分代码的缺陷总结

在这块代码中,整体功能实现是 OK 的,但从可读性、可维护性和可扩展性来看,存在一些典型的设计缺陷,集中体现在各种数组和常量的使用方式上。

2025-11-16 16:57:28 501

原创 VGLITE渐变填充功能封装

该函数是一个典型的“矢量图形渐变填充”实现,通过vg_lite渐变配置(颜色、过渡点、变换);路径定义(填充区域的形状);最终绘制(将渐变填充到路径区域)。常用于图表(如面积图)的填充效果,让图形从一种颜色平滑过渡到另一种颜色,提升视觉效果。

2025-11-13 14:04:12 604

原创 车载仪表开发:常量定义最佳实践清单

适用场景:调试模式、功能模块开关、多车型适配。示例:// 指示灯测试模式开关(编译时决定是否启用测试代码)1// 多车型适配(A/B车型差异化功能)1// A车型专属指示灯配置#else// B车型专属指示灯配置#endif说明:constexpr 无法替代条件编译,这是宏定义的核心不可替代场景,用于控制编译阶段的代码取舍。

2025-11-10 15:59:25 762

原创 constexpr与宏定义的区别

在 C++ 中, 是一个关键字,用于声明编译期常量或可在编译期执行的函数。它的核心作用是让变量或函数的计算在编译阶段完成,而不是运行时,从而提升程序性能(减少运行时计算)并增强代码安全性(编译期检查)。这里的 表示 是一个编译期常量,即它的值在编译时就已经确定,无法在运行时修改。声明编译期常量和 类似, 修饰的变量必须在声明时初始化,且初始化的值必须是编译期可计算的常量表达式(如字面量、其他 变量的组合等)。例如:与 的区别修饰函数(C++11及以后) 还可以修饰函数,表明该函

2025-11-10 15:58:48 804

原创 C/C++中const指针的赋值规则

指针类型能否修改指针指向的地址?能否修改指向的内容?必须声明时初始化?能不能否不能能(内容非const时)是不能不能是记住核心:const修饰谁,谁就不能被修改。指针本身的可修改性与指向内容的可修改性是独立的,由const的位置决定。在实际开发中,根据是否需要修改指针指向或内容来选择合适的const组合,既能保护数据安全,又能保证代码灵活性。

2025-11-09 15:25:42 306

原创 nullptr vs NULL:C/C++ 空指针的演变史

场景推荐理由纯C项目NULLC语言不支持nullptr纯C++项目nullptr类型安全、现代标准C/C++混合项目看情况协议层用NULL,UI层用nullptr您的项目两者都可以已经混合使用,保持风格统一即可核心原则✅一致性> 完美性(同一文件内保持统一)✅可读性> 教条性(团队习惯最重要)✅安全性:新代码优先用nullptr。

2025-10-15 22:32:41 1025

原创 Git Commit Message 最佳实践:从一次指针Bug说起

写给人看,不是给机器Git已经记录了所有技术细节Commit message应该让人理解意图回答What和Why,不是Where和How✅ 做了什么,为什么做❌ 在哪改的,怎么改的简洁但完整15-50字说清楚必要时添加详细描述一致性很重要团队统一规范使用工具辅助git log --grep = "文本.*乱码" # 找到了你的提交 abc123 修复文本指针取地址错误导致显示乱码 # 点开看详情 git show abc123 # 立即明白了问题和解决方案 # 节省了2小时调试时间。

2025-10-11 11:17:02 874

原创 从一个&符号引发的血案:深入理解C++指针、地址与内存布局

1. 数据本身: "Hello" 在 Flash (0x0800_xxxx)2. 指针变量: str 在 Stack (0x2000_xxxx)3. 指针的地址: &str 也在 Stack关键区别:str = 字符串的地址(应该传这个)✅&str = 指针的地址(千万别传这个)❌。

2025-10-11 11:03:01 466

原创 C++嵌入式开发:虚析构函数警告的深度解析与解决方案

如果类有虚函数,析构函数也应该是虚函数。public:// ✅ 虚析构函数// 纯虚函数虚析构函数是多态类设计的基本要求,不是可选项内存安全比性能更重要,尤其在嵌入式系统中使用现代C++特性overridefinal)让代码更安全重视编译器警告,它们往往指出潜在的严重问题。

2025-10-10 16:22:40 834

原创 C++嵌入式开发:const类型转换的安全性分析

方面说明转换效果去掉const限定符,允许通过指针写入内存本质不改变内存属性(字符串字面量仍在只读区)安全性取决于后续代码是否真的修改内存你的场景相对安全,因为只读取建议用const_cast更明确,或长期改TextInfo转换本身是"欺骗编译器",告诉它"这是可写的"但实际内存仍是只读的只要不真的写入,就是安全的代码是安全的,前提是确实只读取。

2025-10-10 15:47:07 326

原创 字符串字面量转换警告的深度解析

字符串字面量是类型,不应赋值给char*返回,强制转换有风险使用const参数既安全又灵活,是最佳实践不要用强制转换掩盖问题,应从根源上修复// 步骤1:找到所有字符串参数函数// 步骤2:统一加 const// 步骤3:删除所有强制转换// 步骤4:编译验证// - 警告消失// - 代码更简洁// - 类型更安全。

2025-10-10 14:35:33 703

原创 C语言风格哈希表vs C++风格哈希表的区别

特性C语言风格C++风格内存管理手动自动类型安全弱强代码量多少维护性难易性能高高学习成本高低推荐:现代C++项目优先使用;仅在内存受限或需精细控制时考虑C风格实现。

2025-09-27 17:29:11 644

原创 OpenGL ES vs VG-Lite:嵌入式图形渲染引擎对比分析

特性OpenGL ESVG-Lite渲染能力3D + 2D2D为主性能开销较高较低内存使用较大较小开发复杂度较高较低硬件加速支持支持旋转支持需手动实现内置支持。

2025-09-27 15:55:52 431

原创 嵌入式C++开发中全局函数与类成员函数的选择策略

全局函数:简单、高效、易与C互操作,适合无状态工具函数和性能敏感场景。类成员函数:封装性好、命名清晰、支持继承/多态,适合有状态管理和复杂业务。

2025-09-27 15:42:38 411

原创 Data Wrapper(数据包装器) 设计模式实践

包装原始数据:将基本数据类型包装成对象提供统一接口:为不同类型的数据提供相同的访问方式添加额外功能:如验证、日志、观察者模式等// 使用示例:多媒体数据列表DM_ITEM。

2025-09-23 21:47:47 552

原创 字符编码完全指南:从ASCII到Unicode的全面解析

字符编码是将字符映射到数字的规则系统。计算机只能处理数字,因此需要编码来将人类可读的字符转换为计算机可处理的数字。现代应用:优先选择UTF-8传统系统:根据具体需求选择对应编码性能要求:考虑UTF-32(内部处理)和UTF-8(存储传输)存储空间:优先UTF-8兼容性:考虑ASCII兼容性。

2025-09-23 16:30:49 1059

原创 C++ inline 关键字详解

/ 在头文件中定义内联函数// 实现代码// 多个 .cpp 文件包含这个头文件// 内联展开// 内联展开inline性能优化:避免函数调用开销代码展开:在调用点直接插入函数体编译器建议:建议编译器进行内联优化头文件定义:允许在头文件中定义函数而不产生重复定义错误在静态成员函数中使用inline特别有用,因为可以在头文件中直接实现简单的工具函数,既保持了封装性,又获得了性能优势。

2025-09-23 14:52:26 438

原创 C++静态成员函数实现语法详解

public:// 单例模式private:// 静态测试函数// 另一个静态函数// 普通成员函数void ParcelDispatcher::ParcelNotifyTestMultimedia(void) // 正确:不使用 static// 实现代码void ParcelDispatcher::ParcelNotifyTest(void) // 正确:不使用 static// 实现代码// 实现代码声明时:使用static关键字实现时:不使用static关键字。

2025-09-23 14:50:53 208

原创 内部标识符

下划线包裹的命名本质是一种“内部标识隔离把“实现细节”(_XXX_)和“对外接口”(XXX)分开,方便维护和升级。避免不同模块、不同开发者之间的命名冲突(尤其在没有命名空间的C语言中)。_XXX_是内部的,不要直接修改或依赖它,应该用外层的XXX。就像现实中,公司内部文件会标“内部机密”,对外则用公开名称,既保护内部细节,又方便外部使用。

2025-09-22 17:39:30 276

原创 嵌入式(SOC+FreeRTOS)汽车仪表盘接口参数安全:规范遵循与防护实践

在汽车电子领域,基于SOC芯片和FreeRTOS系统的仪表盘是驾驶员获取车辆状态的核心窗口,接口参数安全直接关乎驾驶安全与系统稳定性。本文结合代码规范(尤其是明确接口函数参数合法性检查责任的规则),从案例、防护技术到开发流程,全面解析汽车仪表盘接口参数安全。

2025-09-22 16:51:45 966 3

原创 循环语句效率与规范的原理及示例解析

在C/C++编程中,循环是实现重复操作的核心,但循环的编写方式对程序效率和可读性影响极大。下面结合与,深入解析循环的优化与规范编写。

2025-09-22 16:19:23 681

原创 设置成员变量的成员函数

专门编写SetValue这样的函数,核心是为了实现封装性、数据安全、功能可扩展和接口规范,这是面向对象编程中“高内聚、低耦合”原则的具体体现。不是不能直接赋值,而是通过函数控制赋值过程,让代码更健壮、更易维护。

2025-09-22 15:18:56 231

原创 开阳630HV100芯片的外设配置

开阳630HV100是一款基于ARM Cortex-A5的嵌入式处理器,其外设设计针对工业控制、HMI和物联网应用进行了深度优化。fill:#333;color:#333;color:#333;fill:none;内存接口显示子系统连接接口工业控制安全引擎。

2025-07-12 21:28:33 1055

原创 检查输入有效性(指针是否为NULL)和检查字符串长度是否为0

if(!src)保护的是程序的生命周期(防崩溃)if(len==0)保护的是程序的逻辑正确性(防未定义行为)这正是C语言编程的核心原则:“永远不要信任外部输入,用防御性代码处理所有边界情况”

2025-07-12 21:17:34 440

原创 程序改错---字符串

修正后的函数能安全实现字符串逆序功能,正确处理边界情况,且无内存泄漏风险。

2025-07-12 21:13:53 714

原创 函数指针、指针函数与回调函数详解

指针函数本质:返回指针的函数用途:创建动态数据结构,返回处理结果关键:调用者负责内存管理函数指针本质:指向函数的指针变量用途:实现策略模式、动态绑定关键:提供运行时灵活性回调函数本质:通过函数指针实现的编程模式用途:事件处理、异步编程、算法定制关键:实现控制反转(IoC)指针函数可以返回函数指针回调函数的核心机制是函数指针函数指针使回调成为可能理解这些概念对于编写灵活、可扩展的C程序至关重要,特别是在系统编程、嵌入式开发和框架设计中。

2025-06-22 15:45:10 905

原创 串口115200波特率一秒传输几个字节数据

计算串口115200波特率下的数据传输速率需要考虑。以下是详细计算过程:我们计算串口传输速率时需要考虑以下因素:波特率(Baud Rate):115200 表示每秒钟传输的符号数(symbols per second)。串口数据帧的构成:包括起始位、数据位、校验位和停止位。一个典型的串口数据帧(以最常见的配置为例):1个起始位(低电平)8个数据位(一个字节)1个校验位(可选,这里假设有)1个停止位(高电平)

2025-06-15 18:00:06 2370

原创 C语言位段

位段是C语言中一种强大的特性,特别适合需要精确控制数据位级表示的场景。尽管存在一些限制和平台依赖性问题,但在嵌入式系统、网络编程和硬件交互等领域,位段能提供更清晰、更高效的代码实现。使用时需要注意位段的溢出、对齐和可移植性问题。

2025-06-15 17:30:29 300

原创 大小端的区别

理解大小端对底层编程、网络协议开发和跨平台开发至关重要。:必须统一使用网络字节序(大端):某些文件格式规定字节序。:需要明确约定字节序。

2025-06-14 21:42:43 531

原创 C++ QT

的类(可能是一个自定义的类,用于表示一个 LCD 显示屏)。:这个关键字表示接下来的成员函数、变量等是公开的,可以在类的外部被访问。:这是构造函数的名称,它与类名相同,这是 C++ 中构造函数的一个特征。这种父子关系在 Qt 的布局管理和事件处理中非常重要。这行代码是 C++ 中类定义的一部分,它声明了一个名为。:这是构造函数的参数列表。类型的指针作为参数,这个参数有一个默认值。是一个空指针字面量,表示没有指向任何对象。的构造函数,这个构造函数属于一个继承自。不指定父对象,使用默认的。

2024-11-07 17:39:32 464

原创 C程序设计语言(第二版) 第一章导言(框架)

在60年代末,Kenneth Thompson和Dennis Ritchie都曾参加过交互方式分时系统Multics的设计,而开发该系统所使用的工具是CTSS。在此基础上,在对当时现有的技术进行精选提炼和发展的过程中,K.Thompson于1969年在小型计算机上开发UNIX系统,后于1970年投入运行。Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。是一个特殊的转义字符,它用于表示一些特殊的字符序列,这些序列具有特定的意义。的字符串,编译器会报错。

2024-07-10 16:21:35 841

原创 history命令

history 命令用于显示当前用户在命令行中输入的历史命令列表。它会列出之前执行过的所有命令,每条命令都会有一个编号。这个命令不进行过滤或搜索,只是简单地列出了所有的命令历史记录。grep “git”: grep 是一个用于搜索文本的命令,它可以从输入中过滤出包含特定模式的行。在这个指令中,我们使用 grep “git” 来搜索包含字符串 “git” 的行。history: 这个命令用于显示当前用户在命令行中输入的历史命令列表。它会列出之前执行过的所有命令,每条命令都会有一个编号。

2024-04-22 12:18:25 807

原创 开发仪表“时间设置功能”遇到的问题

在进行时间设置时没有按逻辑正常递增递减,在查问题期间花费了些时间,最后功能正常了。1、一个功能可以拆分成几个模块进行封装,减少代码的冗余度;3、注意是否有定时器在刷新,且用到了相同的变量。2、赋值时注意赋值到正确的控件上;

2024-03-30 17:43:32 257

谷粒学苑第11天项目笔记

谷粒学苑第11天项目笔记

2023-03-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除