当前位置: 首页 > news >正文

Linux基础项目开发day05:量产工具——页面系统

文章目录

  • 一、数据结构抽象
    • page_manager.h
  • 二、页面管理器
    • page_manager.c
  • 三、单元测试
    • 1、main.page.c
    • 2、page_test.c
    • 3、Makefile修改
      • 3.1、unittest中的Makefile
      • 3.2、page中的Makefile
  • 四、上机实验

前言

前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的搭建!

一、数据结构抽象

对于每一个页面都会有一个结构体!
在这里插入图片描述
对于每一个结构体抽象出的结构体如下:
在这里插入图片描述

page_manager.h

#ifndef _PAGE_MANAGER_H
#define _PAGE_MANAGER_H/* 定义一个结构体,用于表示页面操作 */
typedef struct PageAction {char *name;                 //页面名称void (*Run)(void *pParams); //指向页面操作函数struct PageAction *ptNext;  //链表
}PageAction, *PPageAction;      /* 声明函数,用于注册页面 */
void PageRegister(PPageAction ptPageAction);/* 声明函数,用于注册所有页面 */
void PagesRegister(void);/* 声明函数,用于根据页面寻找动作名称查找并返回对应的结构体 */
PPageAction Page(char *name);#endif

二、页面管理器

页面管理器用于管理页面,需要实现上层函数!
在这里插入图片描述

page_manager.c

page_manager.c里面就是实现了page_manager.h里面的那三个函数

// 包含公共头文件,可能包含了一些通用的宏定义或者函数声明
#include <common.h>// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>// 包含字符串处理头文件,提供了字符串比较函数strcmp
#include <string.h>// 声明一个静态的全局变量,用于存储页面动作链表的头指针
static PPageAction g_ptPages = NULL;// 实现页面动作注册函数,将新的页面动作添加到链表的头部
void PageRegister(PPageAction ptPageAction)
{// 将新动作的下一个指针指向当前链表的头ptPageAction->ptNext = g_ptPages;// 更新链表头指针,使其指向新添加的动作g_ptPages = ptPageAction;
}// 实现根据名称查找页面动作的函数
PPageAction Page(char *name)
{// 从链表头开始遍历PPageAction ptTmp = g_ptPages;// 遍历链表直到找到匹配的名称或者遍历完整个链表while (ptTmp){// 使用strcmp函数比较名称是否相等if (strcmp(name, ptTmp->name) == 0)// 如果找到匹配的名称,返回对应的页面动作指针return ptTmp;// 移动到下一个页面动作ptTmp = ptTmp->ptNext;}// 如果没有找到匹配的名称,返回NULLreturn NULL;
}// 实现注册所有页面动作的函数
void PagesRegister(void)
{// 声明一个外部函数,用于注册主页面动作extern void MainPageRegister(void);// 调用外部函数注册主页面动作MainPageRegister();
}

三、单元测试

1、main.page.c

// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>// 包含标准输入输出头文件,提供了printf等函数
#include <stdio.h>// 定义一个静态函数,用于执行主页面动作
static void MainPageRun(void *pParams)
{// 使用printf打印文件名、函数名和当前行号,用于调试信息printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}// 定义一个静态的PageAction结构体变量,表示主页面动作
static PageAction g_tMainPage = {// 设置页面动作的名称为"main".name = "main",// 设置执行页面动作的函数为MainPageRun.Run  = MainPageRun,
};// 定义一个函数,用于注册主页面动作
void MainPageRegister(void)
{// 调用页面管理器的注册函数,将主页面动作添加到页面动作链表中PageRegister(&g_tMainPage);
}

__FILE__文件,FUNCTION 函数名,LINE 行数

2、page_test.c

// 包含内存映射相关的头文件
#include <sys/mman.h>// 包含系统类型定义的头文件
#include <sys/types.h>// 包含文件状态相关的头文件
#include <sys/stat.h>// 包含Unix标准函数定义的头文件
#include <unistd.h>// 包含Linux帧缓冲设备相关的头文件
#include <linux/fb.h>// 包含文件控制选项相关的头文件
#include <fcntl.h>// 包含标准输入输出函数定义的头文件
#include <stdio.h>// 包含字符串处理函数定义的头文件
#include <string.h>// 包含输入输出控制函数定义的头文件
#include <sys/ioctl.h>// 包含标准库函数定义的头文件
#include <stdlib.h>// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>// 程序入口点,接受命令行参数
int main(int argc, char **argv)
{// 注册所有页面动作,这通常会在程序启动时执行PagesRegister();// 查找名为"main"的页面动作,并执行其Run函数// 这里传递了一个NULL参数,表示没有额外的参数传递给Run函数Page("main")->Run(NULL);// 程序正常退出,返回0return 0;
}

3、Makefile修改

3.1、unittest中的Makefile

EXTRA_CFLAGS  := 
CFLAGS_file.o := #obj-y += disp_test.o
#obj-y += input_test.o
#obj-y += font_test.o
#obj-y += ui_test.o
obj-y += page_test.o

3.2、page中的Makefile

EXTRA_CFLAGS  := 
CFLAGS_file.o := obj-y += page_manager.o
obj-y += main_page.o

四、上机实验

book@100ask:~/source$ make
book@100ask:~/source$ cp -r 23_page_unittest/ ~/nfs_rootfs/

[root@100ask:/]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
//挂载目录
[root@100ask:/mnt/23_page_unittest]# ./test ./simsun.ttc

上机运行效果:
在这里插入图片描述

相关文章:

Linux基础项目开发day05:量产工具——页面系统

文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统&#xff0c;现在我们就来实现页面的…...

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…...

2024市场营销第3次课

品牌管理 1.认识品牌 品牌定义&#xff1a;一个名称、术语、标志、符号或设计&#xff0c;或者是它们的组合&#xff0c;用来识别某个销售商或某一群销售商的产品或服务&#xff0c;并使其与竞争者的产品或服务区分开来。 品牌构成&#xff1a;成功品牌的构成都是由外及内的…...

Python基础之函数的定义与调用

一、函数的定义 在Python中&#xff0c;函数是一段可重复使用的代码块&#xff0c;用于完成特定的任务。可以使用def关键字来定义函数。 语法如下&#xff1a; def function_name(parameters): """docstring""" # function body return expres…...

GPU在AI绘画中的作用以及GPU的选择

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 GPU在AI绘画中的作用&#xff1a; GPU在A…...

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置...

mysql学习教程,从入门到精通,SQL 注入(42)

1、 SQL 注入 SQL 注入是一种严重的安全漏洞&#xff0c;它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害&#xff0c;我不能提供具体的恶意代码示例。然而&#xff0c;我可以向你展示如何防御 SQL 注入&#xff0c;并解释其工作原理…...

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

图论day60|108.冗余连接&#xff08;卡码网&#xff09;、109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁信心的一题&#xff0c;胆小的走开&#xff01;】 108.冗余连接&#xff08;卡码网&#xff09;109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁…...

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域&#xff0c;MetaTrader是一款备受欢迎的交易软件&#xff0c;包括MT5和MT4&#xff0c;提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言&#xff0c;编写专家顾问&#xff08;EA&#xff09;可能显得既复杂又令人望而却步。幸运的是&…...

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka&#xff0c;本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业&#xff08;Load job&#xff09; 导入作业会常驻运行&#xff0c;当导入作业的状态为 R…...

从零开始学PHP之输出语句变量常量

一、 输出方式 在 PHP 中输出方式&#xff1a; echo&#xff0c;print&#xff0c;print_r&#xff0c;var_dump 1、echo和print为php的输出语句 2、var_dump&#xff0c;print_r为php的输出函数 &#xff08;这里不做介绍&#xff09;echo 和 print 区别 1、echo - 可以输出…...

二叉树算法之字典树(Trie)详细解读

字典树&#xff08;Trie&#xff0c;也称前缀树或单词查找树&#xff09;是一种用于快速查找字符串的数据结构&#xff0c;主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合&#xff0c;比如单词自动补全、拼写检查等场景。 1. 字典树的…...

butterfly侧边栏音乐模块

方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹&#xff08;如果没有_data文件夹&#xff09; 2.在刚刚的_data文件夹里创建widget.yml文件 bottom:- class_name: user-musicid_name: user-musicname: 音乐icon: fas fa-heartbeatorder:html: <…...

【论文阅读】Detach and unite: A simple meta-transfer for few-shot learning

分离与联合&#xff1a;一种用于小样本学习的简单元迁移方法 引用&#xff1a;Zheng Y, Zhang X, Tian Z, et al. Detach and unite: A simple meta-transfer for few-shot learning[J]. Knowledge-Based Systems, 2023, 277: 110798. 论文地址&#xff1a;下载地址 论文代码&a…...

Java中的动态代理——介绍与使用示例

Java中的动态代理其实就是一种“代理”模式&#xff0c;在运行时帮我们创建一个“代理对象”&#xff0c;通过这个代理对象可以在不改变原本方法的情况下&#xff0c;做一些额外的事情&#xff0c;比如记录日志、检查权限等。这种代理机制非常灵活和实用&#xff0c;特别是在像…...

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频&#xff1a; P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…...

Python | Leetcode Python题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution:def constructRectangle(self, area: int) -> List[int]:w int(sqrt(area))while area % w:w - 1return [area // w, w]...

新版vs code + Vue高亮、语法自动补全插件

vs code 版本或及以上 安装以下三个插件插件 Vetur Vue语法支持。包括语法高亮、语法代码提示、语法lint检测 ESLint语法纠错 Prettier 2.左下角设置 3.进行配置 配置内容&#xff1a; {"editor.fontSize": 20,"window.zoomLevel": 1,"workben…...

【优选算法】(第四十五篇)

目录 地图分析&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 课程表&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 地图分析&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#…...

PCIe Retimer实战:Execution Mode下Link Equalization的调试技巧与常见问题排查

PCIe Retimer实战&#xff1a;Execution Mode下Link Equalization的调试技巧与常见问题排查 在高速串行通信领域&#xff0c;PCIe Retimer作为信号完整性的关键组件&#xff0c;其Execution Mode下的Link Equalization过程往往是硬件工程师调试链路时的重点难点。本文将深入剖析…...

Simufact.Forming工艺链仿真实战:从冷成型到热处理的完整流程配置技巧

Simufact.Forming工艺链仿真实战&#xff1a;从冷成型到热处理的完整流程配置技巧 在高端制造领域&#xff0c;工艺链仿真是确保产品质量和生产效率的关键环节。Simufact.Forming作为业界领先的金属成型仿真解决方案&#xff0c;其工艺链功能能够无缝衔接从冷成型到热处理的完整…...

开源力量:OpenClaw+gemma-3-12b-it构建低成本个人AI助手

开源力量&#xff1a;OpenClawgemma-3-12b-it构建低成本个人AI助手 1. 为什么选择开源模型OpenClaw组合&#xff1f; 去年我尝试用商业API搭建个人自动化助手时&#xff0c;发现两个致命问题&#xff1a;一是每月Token费用超过预期3倍&#xff08;主要来自长链条任务的反复调…...

OpenClaw+千问3.5-9B会议纪要:语音转文字自动生成重点

OpenClaw千问3.5-9B会议纪要&#xff1a;语音转文字自动生成重点 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为团队里经常负责记录的人&#xff0c;我经历过太多这样的场景&#xff1a;会议中疯狂打字记录&#xff0c;结果漏掉关键讨论点&#xff…...

日志系统整体设计步骤以及功能函数梳理

首先到底要做一个什么东西&#xff1f;我们要造一个 C 高并发异步日志库&#xff0c;功能如下&#xff1a;用 LOG_INFO << "xxx" 这种简单写法自动带&#xff1a;时间、级别、文件名、函数名、行号支持级别过滤&#xff08;TRACE/DEBUG/INFO/WARN/ERROR/FATAL&…...

C语言goto语句的争议与现代替代方案

1. goto语句的本质与历史争议 goto语句是C语言中最具争议的特性之一。从语法上看&#xff0c;它简单到令人不安——只需一个标签和一行指令&#xff0c;就能让程序执行流发生任意跳转。在早期的编程实践中&#xff0c;这种不受约束的控制流方式确实带来了灵活性&#xff0c;但也…...

基于MATLAB与机器学习(SVM)的裂缝检测识别系统,附GUI界面、特征参数计算与Excel...

基于MATLAB和机器学习&#xff08;向量机&#xff09;的裂缝检测&#xff08;识别&#xff09;系统程序&#xff0c;带GUI界面&#xff0c;对裂缝主要参数&#xff08;长度&#xff0c;宽度&#xff0c;面积&#xff09;进行计算&#xff0c;已经训练好分类器&#xff0c;包含裂…...

如何快速解决Hackintosh配置难题:OpCore-Simplify终极解决方案指南

如何快速解决Hackintosh配置难题&#xff1a;OpCore-Simplify终极解决方案指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的OpenCore …...

Planify Nextcloud集成:私有云环境下的安全任务同步终极指南

Planify Nextcloud集成&#xff1a;私有云环境下的安全任务同步终极指南 【免费下载链接】planify Task manager with Todoist, Nextcloud & CalDAV support designed for GNOME 项目地址: https://gitcode.com/gh_mirrors/pl/planify Planify是一款专为GNOME设计的…...

工业组态软件Intouch(单机版)基础功能实战指南

1. Intouch单机版基础认知与安装准备 第一次接触工业组态软件的朋友&#xff0c;可以把Intouch理解成工业界的"翻译官设计师"。它负责把PLC设备里那些冰冷的数字信号&#xff0c;转换成操作工能看懂的动画界面。我十年前刚入行时&#xff0c;最头疼的就是看不懂设备状…...