C语言
文章平均质量分 86
天上下橙雨
学海无涯。
展开
-
【学习笔记】程序的编译和链接
在开发程序的过程中,编译和链接是一定会经历但很少被重视的步骤,通常这两个步骤会被 IDE 封装,开发者只需一键构建即可,但遇到错误(尤其是链接相关的错误)时,如果不了解编译和链接的原理,就很难定位并解决问题。本文则尝试分析并记录程序编译和链接的整个过程。...原创 2022-07-03 16:34:34 · 384 阅读 · 0 评论 -
C/C++测试程序运行时所需的栈大小
文章目录一、前言二、测试原理2.1 alloca 函数2.2 原理分析三、示例代码四、注意事项一、前言由于工作需要,最近在研究怎么测试程序用掉的栈大小,这里感谢领导给我提供了一个很不错的思路,只需要要一个 alloca 函数就能搞定,在此记录分享一下,以备不时之需。二、测试原理2.1 alloca 函数在讲原理之前,我们需要先了解一个关键的函数—— alloca 函数。alloca 函数是一个内存分配函数,与malloc、calloc、realloc类似,但是注意一个重要的区别:alloca 是原创 2021-11-21 20:34:25 · 2513 阅读 · 0 评论 -
嵌入式Linux(awtk-linux-fb)双屏显示
目录一、前言二、双屏显示的原理三、如何实现双屏显示3.1 确认两个屏幕的驱动文件3.2 初始化时打开 LCD 驱动文件3.3 重载 lcd_t 对象的 flush 函数3.4 实现双屏图像拷贝一、前言近期尝试了在嵌入式 Linux 上适配双屏显示,即外接两个显示屏,同步显示 GUI 界面,其难点主要在于从 Flush 时将图像拷贝到两个 LCD 设备中,本文做个记录。注意:本文基于 AWTK 针对 arm-linux 平台的移植适配双屏显示。AWTK 是为嵌入式系统开发的 GUI 引擎库,GitH原创 2021-09-05 19:36:39 · 1175 阅读 · 0 评论 -
awtk-widget-chart-view-mvvm JS版本适配笔记
目录一、前言二、适配 JS 版本的序列点数据(FIFO)2.1 series_fifo_js 的接口2.1 series_fifo_js 的实现三、自定义 binder四、JS 语言绑定 chart view 控件4.1 注册自定义 binder4.2 创建并绑定 Model4.3 Model 变化4.3.1 使用自定义接口4.3.2 使用原生接口一、前言awtk-widget-chart-view 是 AWTK 提供的图表自定义控件,该控件包含:曲线图、柱状图和饼图。前段时间记录了该控件适配 AWT原创 2021-07-10 18:27:28 · 465 阅读 · 0 评论 -
awtk-widget-chart-view-mvvm C版本适配笔记
目录一、前言二、序列点数据结构(FIFO)三、重构FIFO3.1 object_fifo_t3.2 object_fifo_default_t四、添加替换FIFO的接口五、实现C版本的MVVM示例5.1 数据绑定5.2 Model 层5.3 ViewModel层一、前言awtk-widget-chart-view 是 AWTK 提供的图表自定义控件,该控件包含:曲线图、柱状图和饼图。最近需要让该控件支持 AWTK-MVVM,但受限于原有的接口,实现起来有点麻烦,因此重构了 chart-view 控件序列原创 2021-06-20 14:42:21 · 591 阅读 · 4 评论 -
设计模式学习(十四):职责链模式
目录一、前言二、职责链模式三、示例介绍四、结构与参与者五、AWTK中的应用六、总结6.1 优缺点6.2 应用场景一、前言本周参加了第九次设计模式研讨会,主题是职责链模式,接下来我们来看看该模式的具体内容。二、职责链模式职责链模式:为请求创建了一个接受者对象的链。该模式给予请求的类型,对请求的发送者和接受者进行解耦。意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。主要解决:职责链上的处理者负责处理原创 2021-06-14 20:46:09 · 159 阅读 · 0 评论 -
嵌入式Linux(awtk-linux-fb)适配鼠标滚动事件
目录一、前言二、awtk-linux-fb三、如何支持鼠标滚轮事件3.1 判断鼠标驱动是否支持滚轮事件3.2 找到正确的鼠标设备文件名3.3 适配鼠标滚轮事件3.3.1 捕捉滚轮事件并将其转化后分发给AWTK3.3.2 适配其他嵌入式 Linux 平台或其他事件一、前言近期尝试了在嵌入式 Linux 上适配鼠标滚轮事件,其难点主要在于从鼠标驱动文件中获取滚轮事件,本文做个记录。注意:本文基于 AWTK 针对 arm-linux 平台的移植适配鼠标滚轮事件。AWTK 是为嵌入式系统开发的 GUI 引原创 2021-06-06 21:41:43 · 613 阅读 · 0 评论 -
【学习笔记5】管道通信:命名管道
目录一、前言二、基本概念三、命名管道的创建和使用3.1 函数原型3.1.1 CreateNamedPipe3.1.2 ConnectNamedPipe3.1.3 WaitNamedPipe3.2 示例代码3.2.1 实现步骤3.2.2 服务端代码3.2.3 客户端代码3.2.4 输出结果四、总结一、前言之前的 【学习笔记3】 中讲述了匿名管道的实现方法,本文来学习一下命名管道的内容,希望对自己与各位有所帮助。二、基本概念命名管道(Named Pipes),按照字面意思理解就是有名字的管道,它可在同一转载 2021-05-24 20:58:41 · 1103 阅读 · 1 评论 -
【学习笔记4】使用匿名管道和CreateProcess隐式调用控制台程序
目录一、前言二、核心内容三、示例代码一、前言近期工作内容需要在一个程序中包装一个控制台程序,用于执行cmd命令获取结果,经过对Windows平台进程和管道通信的学习后,采用 匿名管道 和 CreateProcess 隐式调用控制台程序来实现这个需求。二、核心内容【学习笔记1】Windows平台进程创建和退出 记录了 CreateProcess 的基本用法。【学习笔记3】管道通信:匿名管道 记录了匿名管道的定义及其基本用法。本文使用匿名管道和CreateProcess隐式调用控制台程序,核心内原创 2021-05-09 19:29:22 · 264 阅读 · 0 评论 -
【学习笔记3】管道通信:匿名管道
目录一、前言二、管道的概念三、匿名管道的创建和使用3.1 函数原型3.1.1 CreatePipe3.1.2 ReadFile3.1.3 WriteFile3.1.4 CloseHandle3.2 管道使用技巧3.3 示例代码一、前言上篇笔记(【学习笔记2】管道通信:输入输出重定向)记录了输入输出重定向的实现方法,本文总结一下匿名管道的内容,希望对自己与各位有所帮助。二、管道的概念简单理解,计算机中的管道(pipe)类似现实世界中的水管,从一端放入水流,另一端就会流出来。回到计算机中,这个水流就是数转载 2021-05-09 18:44:17 · 420 阅读 · 0 评论 -
【学习笔记2】管道通信:输入输出重定向
目录一、前言二、示例介绍三、实现输入输出重定向3.1 使用C语言的freopen()函数3.1.1 函数原型3.1.2 使用方法3.1.3 示例代码3.2 使用C++的ifstream类和ofstream类3.2.1 使用方法3.2.2 示例代码一、前言近期工作内容需要研究进程间的通信,项目拟使用管道实现进程通信,因此将学习的内容简单整理一下,希望对自己与各位有所帮助。二、示例介绍本文简单介绍输入输出的重定向问题,首先看一个示例,假如有一个程序的输入输出作为标准输入输出,即从键盘上输入,然后输出(打转载 2021-05-05 21:21:59 · 611 阅读 · 0 评论 -
【学习笔记1】Windows平台进程创建和退出
目录一、前言二、进程的概念三、进程的三种状态四、进程的创建4.1 Winexec4.1.1 API声明4.1.2 示例代码4.2 ShellExcute4.2.1 API声明4.2.2 示例代码4.3 CreateProcess4.3.1 API声明4.3.2 示例代码五、进程的退出一、前言近期工作内容需要研究 Windows 平台的进程间通信,因此将学习的内容简单整理一下,希望对自己与各位有所帮助。二、进程的概念进程是资源分配的基本单位,也是独立运行的基本单位。通俗讲就是一段程序执行的过程。进程原创 2021-05-05 20:28:59 · 550 阅读 · 0 评论 -
FreeType解析矢量字体存在的问题以及优化技巧
目录一、前言二、FreeType 存在的问题三、针对 FreeType 存在问题的优化技巧3.1 提高 FreeType 解析字体的精度3.2 关闭 auto\_hint四、总结一、前言首先,再阅读本文之前需要对 FreeType 的使用方法有基本的了解,可以参考:FreeTpye库学习笔记:将矢量字体解析为位图。二、FreeType 存在的问题矢量字体(TrueType)通过数学曲线来描述字形,包含字形边界上的关键点、连线的导数信息等。FreeType 解析矢量字体的过程是将字形关键点按照规则连原创 2021-03-28 19:40:41 · 2335 阅读 · 0 评论 -
FreeTpye库学习笔记:将矢量字体解析为位图
目录一、前言二、FreeType解析矢量(.ttf)字体2.1 包含头文件2.2 初始化 FreeType 库2.3 加载 FT_Face2.4 设置字体编码方式2.5 设置字体大小2.6 加载字形图像2.6.1 获取字符编码的字形索引2.6.2 通过索引从face中加载字形2.6.3 将字形转化为位图2.6.4 一步到位2.7 完整示例代码三、总结一、前言近期工作需要研究 FreeType 库,因此本篇文章记录一下该库的基本用法。FreeType 是一个免费、开源、可移植且高质量的字体引擎,它有以下原创 2021-03-14 13:32:03 · 2240 阅读 · 0 评论 -
设计模式学习(七):适配器模式及其在AWTK中的应用
目录一、前言二、适配器模式三、实际例子四、结构与参与者4.1 类适配器(多重继承)4.2 对象适配器(依赖对象组合)4.3 参与者4.4 两种适配器实现的比较五、适配器模式在AWTK中的应用六、总结一、前言本周参加了第三次设计模式研讨会,主题是适配器(Adapter)模式,接下来我们来看看该模式的具体内容。二、适配器模式Adapter模式:将一个类的接口转换成用户希望的另一个接口。意图:使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决:主要解决在软件系统中,常常要将一些“现存的原创 2021-03-06 19:14:01 · 370 阅读 · 0 评论 -
设计模式学习(六):原型模式及其在AWTK中的应用
目录一、前言二、原型模式三、原型模式在AWTK中的应用四、总结4.1 优缺点5.1 适用场景一、前言原型模式(Prototype Pattern)相对比较简单,因此并不为其专门开一次研讨会,在闲余时间自行学习,接下来我们来看看该模式的具体内容。二、原型模式原型模式即实现一个原型接口,该接口用于创建当前对象的克隆。意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对原创 2021-03-06 13:36:40 · 247 阅读 · 0 评论 -
设计模式学习(五):单例模式及其优化示例(C语言)
一、前言单例模式(Singleton Pattern)是最简单的设计模式之一,因此并不为其专门开一次研讨会,在闲余时间自行学习,接下来我们来看看该模式的具体内容。、二、单例模式单例模式即保证一个类仅有一个实例,并提供一个访问它的全局访问点单例模式本质上就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。由此可见,单例模式主要是用来避免 一个全局使用的类被频繁地创建与销毁 的情况,当我们想控制实例数目或者节省系统资原创 2021-02-24 22:27:11 · 384 阅读 · 0 评论 -
设计模式学习(四):基于Builder模式的歌词解析器
一、前言上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子——基于Builder模式的歌词解析器。二、示例介绍歌词文件(.lrc)是一种文本文件,用来描述歌曲的歌词。在该文件的帮助下,音乐播放器可以根据相应时间同步显示歌词。歌词文件由时间标签、ID标签和歌词组成。时间标签,例如:[00:23.25]ID标签,例如:[ar:谭咏麟]歌词,例如:凄雨冷风中 多少繁华如梦下面是谭咏麟先生的歌曲 水中花 歌词的截原创 2021-02-21 18:59:01 · 219 阅读 · 0 评论 -
设计模式学习(二):实现可动态注册的简单工厂模式(C语言)
一、前言上周学习了抽象工厂模式,该模式包含了简单工厂模式和工厂方法的某些特性,三者之间的区别详见:上周博客,本周深入了解一下简单工厂模式,并对其进行优化,实现一个可动态注册的简单工厂,本次练习参考了AWTK源码中 widget_factory 的实现,感兴趣的可以查阅源码,GitHub仓库:https://github.com/zlgopen/awtk。AWTK是 ZLG 开发的开源 GUI 引擎,官网地址:https://www.zlg.cn/index/pub/awtk.html。二、简单原创 2021-01-31 13:47:48 · 408 阅读 · 0 评论 -
设计模式学习(一):抽象工厂模式以及C语言示例
一、前言近期有幸参加了李先静李老师组织的设计模式研讨会,与各位同事共同学习探讨设计模式的相关知识,往后的大多数的博客内容将会围绕设计模式的学习展开。研讨会内容参考书籍《设计模式——可复用面向对象软件的基础 》,博客中也会大量引用这本书里的定义,但这本书的翻译真的晦涩难读,在博客中我尽量用一些通俗的描述代替,也方便以后自己查阅。李老师博客地址:http://blog.csdn.net/absurd。二、抽象工厂模式抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂原创 2021-01-24 14:10:51 · 408 阅读 · 2 评论 -
stb_truetype解析ttf字体并将其保存到图片中
一、前言这段时间的工作需要研究stb_truetype库,因此本篇文章记录一下该库的基本用法。stb_truetype是一个常见字体加载库, 只有一个头文件, 功能虽没有freetype库强大,但代码量小很多,在Flash非常小的开发板上也可以用,觉得freetype库太大的,建议使用stb_truetype库。stb库的GitHub仓库:https://github.com/nothings/stb。二、stb_truetype解析ttf字体使用stb_truetype库解析ttf字体的步骤通原创 2021-01-17 18:16:27 · 3231 阅读 · 9 评论 -
AWTK-MVVM学习(二):数据绑定与命令绑定
一、前言在原创 2021-01-03 16:50:39 · 423 阅读 · 0 评论 -
AWTK-MVVM学习(一):设计图书管理系统的Model
一、前言最近要使用MVVM框架实现图书管理系统的AWTK GUI界面,因此需要学习awtk-mvvm,该项目的说明文档非常详尽,本文仅记录学习awtk-mvvm过程中的要点,并不作为教程,更详细且严谨的请参考awtk-mvvm/docs下的md文档,相信各位也会大有所获。awtk-mvvm仓库:http://github.com/zlgopen/awtk-mvvm二、什么是MVVM?MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。MVVM就是将其中的View原创 2020-12-26 19:18:15 · 783 阅读 · 0 评论 -
VLD(Visual Leak Detector)在Visual Studio 2015中的使用
一、前言本周在工作中接触了VLD(Visual Leak Detector)工具,该工具是一款在Visual Studio C++中使用的开源的检测内存泄露软件,本文从编译VLD开始记录该工具的使用方法。二、下载VLDVLD的仓库链接:https://github.com/KindDragon/vld下载后目录如下:三、编译VLD使用Visual Studio 2015打开vld_vs14.sln,打开工程如下:编译其中的“vld”工程,若编译Win32版本,则会在vld/src/Win原创 2020-12-19 21:19:30 · 1178 阅读 · 1 评论 -
Linux DRM基本概念与使用示例(C语言)
一、前言在本周的工作中为解决客户问题,查看awtk-linux-fb中的源码,其中对于里面关于DRM的内容很感兴趣,请教同事后又上网查了资料,本文对DRM的学习做了总结记录,并以C语言练习了DRM的使用。在此感谢回答我疑问的同事。注:awtk-linux-fb是AWTK针对arm-linux平台的移植,github仓库:https://github.com/zlgopen/awtk-linux-fb。二、什么是DRMDRM( Direct Rendering Manager)即直接渲染管理器。原创 2020-12-12 12:53:34 · 6810 阅读 · 0 评论 -
SQLite的基本用法(C语言)
一、什么是SQLite SQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。二、SQL语句特点: 不区分大小写,每条语句后加";"结尾。关键字: select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。表的原创 2020-12-06 17:38:50 · 1452 阅读 · 0 评论 -
Repository模式及其在C语言中的应用
什么是Repository模式? Repository是一个独立的层,介于领域层(业务逻辑层)与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。Repository 模式是架构模式,在设计架构时,才有参考价值;Repository 模式主要是封装数据查询和存储逻辑;Repository 模式实原创 2020-11-29 20:44:02 · 570 阅读 · 1 评论 -
【练习记录】C语言实现正则表达式匹配
一、题目描述传入一个字符串 s 和一个字符规律 p,实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。字符’.‘的含义 :匹配任意单个字符字符’*'的含义: 匹配零个或多个前面的那一个元素注意:匹配是指涵盖整个字符串s,而不是部分字符串。示例1:输入:s = "aa" p = "a"输出:false解释:"a" 无法匹配 "aa" 整个字符串。示例2:输入:s = "aa" p = "a*"输出:true解释:'*' 代表可以匹配零个或多个前面的那个元素, 此处为 'a',因原创 2020-11-22 21:59:32 · 810 阅读 · 0 评论 -
契约式设计(Dbc)以及其在C语言中的应用
转载时请表明出处作者联系方式:liuyuxin0829@qq.com一、前言 本周培训中接触到了契约式设计,查阅了许多资料后仍然是一知半解,与同事和大学导师交流了后,受到了启发,本文记录总结了个人对契约式设计的学习感悟。二、什么是契约式设计?1、概述 契约式设计/契约式编码(Design by Contract(DbC),以下简称 DbC )是一种设计计算机软件的方法。这种方法描述了,软件设计者应该为软件组件定义正式的、准确的、可验证的接口规范,它扩展了抽象数据类型对于先验条件、后验条件和不原创 2020-11-08 13:59:32 · 1647 阅读 · 1 评论 -
C语言——使用回调函数降低耦合(隔离变化)
一、前言 耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。 编写代码有两个核心点:隔离变化、降低复杂度,而解耦是达到这两个目标的重要手段。在本周的培训中,学习了使用回调函数隔离代码中变化的部分,以下做一个记录。二、使用回调函数降低耦合 问题描述:实现回家函数come_home,传入出发的时间,打印回家的方式以及到家的时间,有两种回家方式:开车、走路。其中开车需要1小时,走路需要3小时。 功能分析:由于回家方式不同,所用时原创 2020-10-29 21:34:39 · 1502 阅读 · 4 评论 -
单元测试FIRST原则以及基于GTest进行单元测试
转载时请表明出处作者联系方式:liuyuxin0829@qq.com一、前言 在大学的时候,写代码随心所欲,想到什么就写什么,只顾实现功能,也不会去验证代码的可行性和稳定性,往往都会在在后续的使用过程中出现各种各样的问题,然后再去捉虫,这样写出来的代码质量差,在后期又耗费大量的时间修复旧代码bug。 参加工作后,接触到了单元测试,在第一个月的考核项目(智能家居控制面板)中,通过请教同事和参考AWTK源码中的单元测试代码,磕磕绊绊得写了一些单元测试,但由于没有设计好项目基础框架,业务逻辑和用户界面原创 2020-10-25 14:03:07 · 1092 阅读 · 0 评论 -
状态机基本概念以及使用状态机实现单词计数(C语言)
转载时请表明出处作者联系方式:liuyuxin0829@qq.com 在本周的培训内容中,接触到了“状态机”一词,这是什么意思?用来做什么?怎么做?以下记录了初识状态机的学习感悟,并使用状态机原理实现了简单的单词计数实例。什么是状态机? 根据查阅到的资料总结,状态机是一个有向图形,又可称状态转移图,由一组节点和一组相应的转移函数组成。 举一个简单的例子:人有三个状态(节点):健康、感冒、康复中。触发的条件(转移函数)有淋雨、吃药、打针、休息。状态机如下图所示:[外链图片转存失败,源站可能有防原创 2020-10-24 19:17:32 · 997 阅读 · 2 评论 -
C语言关键字和保留标识符
粗体表示C90标准新增关键字,斜体表示C99标准新增的关键字,粗斜体表示C11标准新增的关键字。IOS C关键字 auto extern short while break float signed _Alignas case for sizeof _Alignof char goto static _Ato...原创 2018-10-17 18:36:45 · 1120 阅读 · 0 评论 -
C语言编译器和链接器的作用
源代码(.c)→编译器→目标代码(.obj)→链接器(+库代码&启动代码)→可执行代码(.exe)原创 2018-10-16 19:38:01 · 3078 阅读 · 0 评论