嵌入式框架Zorb Framework搭建三:列表的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
一、前言
在这一篇中,我们将为Zorb Framework提供列表功能。列表是我最喜欢用的数据结构,没有之一。在只要涉及到管理对象不止一个的时候,我就会想到列表。后面将要设计的状态机、事件、定时器和任务等等都需要列表的支持,可以说列表在整个框架里边是必不可少的一个功能。
二、列表设计
我们先来看看要实现的列表提供什么功能:
初步要提供的功能如下:
1、可以在指定位置增加数据
2、可以在指定位置删除数据
3、可以知道列表数据的个数
4、可以清空列表
5、可以不释放数据,仅仅把数据移出列表
6、可以根据数据获取它所在的索引
因此,初步设计的数据结构如下:
/* 列表节点结构 */
typedef struct _ListNode
{
bool IsExternData; /* 是否外部数据,是则销毁时不释放 */
uint8_t *pData; /* 指向数据的指针 */
uint32_t Size; /* 数据的大小 */
struct _ListNode *Next; /* 指向下一个节点 */
} ListNode; /* 列表结构 */
typedef struct _List
{
ListNode *pRootNode; /* 指向根节点数据 */
uint32_t Count; /* 节点个数 */ /* 在尾端增加节点 */
bool (*Add)(struct _List * const pList, ListNode *pNode); /* 删除节点(释放空间) */
bool (*Delete)(struct _List * const pList, ListNode *pNode); /* 移除节点(不释放空间) */
bool (*Remove)(struct _List * const pList, ListNode *pNode); /* 返回指定索引处的节点的指针 */
bool (*GetElementAt)(struct _List * const pList, uint32_t index,
ListNode **ppNode); /* 返回数据区指向data的节点的指针 */
bool (*GetElementByData)(struct _List * const pList, void *pdata,
ListNode **ppNode); /* 返回指定索引处的节点的数据缓冲区的指针 */
void *(*GetElementDataAt)(struct _List * const pList, uint32_t index); /* 返回节点的索引 */
bool (*GetElementIndex)(struct _List * const pList, ListNode *pNode,
uint32_t *pIndex); /* 在指定索引处增加节点 */
bool (*AddElementAt)(struct _List * const pList, uint32_t index,
ListNode *pNode); /* 在指定索引处删除节点(释放空间) */
bool (*DeleteElementAt)(struct _List * const pList, uint32_t index); /* 在指定索引处移除节点(不释放空间) */
bool (*RemoveElementAt)(struct _List * const pList, uint32_t index); /* 清空列表(释放空间) */
bool (*Clear)(struct _List * const pList); /* 释放列表(释放空间) */
bool (*Dispose)(struct _List * const pList);
} List;
为了实现动态列表,在列表中提供了一个Dispose的功能。
列表已经设计好了,具体实现请看附件代码或在文末的github地址拉框架源码。
三、列表结果测试
简单的测试代码如下:
/**
*****************************************************************************
* @file app_list.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 列表测试的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "app_list.h"
#include "zf_includes.h"
#include "string.h" /* 列表指针 */
List *pBookList; /* 书本数据结构 */
typedef struct _Book
{
uint32_t Index; /* 索引 */
char Name[]; /* 书名 */
} Book; /******************************************************************************
* 描述 :任务初始化
* 参数 :无
* 返回 :无
******************************************************************************/
void App_List_init(void)
{
/* 创建列表 */
List_create(&pBookList);
} /******************************************************************************
* 描述 :任务程序
* 参数 :无
* 返回 :无
******************************************************************************/
void App_List_process(void)
{
uint32_t i;
ListNode *pNode;
Book *pBook; ZF_DEBUG(LOG_D, "book list count before adding data is %d\r\n",
pBookList->Count); /* 填充10个数据 */
for (i = ; i < ; i++)
{
/* 创建节点 */
List_mallocNode(&pNode, (void **)&pBook, sizeof(Book)); /* 填充节点内容 */
pBook->Index = i;
strcpy(pBook->Name, "book x");
pBook->Name[] = '' + i; /* 添加到列表 */
pBookList->Add(pBookList, pNode);
} ZF_DEBUG(LOG_D, "book list count after adding data is %d\r\n",
pBookList->Count); /* 读出第3个数据看是否正确 */
pBook = (Book *)pBookList->GetElementDataAt(pBookList, ); ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name); ZF_DEBUG(LOG_D, "\r\n"); /* 删除第5个数据 */
pBookList->DeleteElementAt(pBookList, ); ZF_DEBUG(LOG_D, "book list count after deleteing data is %d\r\n",
pBookList->Count); /* 显示现有数据 */
for (i = ; i < pBookList->Count; i++)
{
pBook = (Book *)pBookList->GetElementDataAt(pBookList, i); ZF_DEBUG(LOG_D, "\r\n");
ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
} while();
} /******************************** END OF FILE ********************************/
结果:
book list count before adding data is
book list count after adding data is
book index is
book name is book book list count after deleteing data is book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book
四、最后
本篇为Zorb Framework提供了列表功能,而且这个列表可以装载不同类型的数据。可以说是小功能,大作用。
Zorb Framework github:https://github.com/54zorb/Zorb-Framework
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟
嵌入式框架Zorb Framework搭建三:列表的实现的更多相关文章
- 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建四:状态机的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建五:事件的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建六:定时器的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建七:任务的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- iOS9全新的联系人相关框架——Contacts Framework
iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...
- 最新 iOS 框架整体梳理(三)
这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3 ...
- 使用Yii框架中遇到的三个问题
以下由我们在信易网络公司开发项目的时候终结出的一些经验 使用Yii框架中遇到的三个问题 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应 ...
随机推荐
- 2.安装 Android SDK
安装Android SDK Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序.简单来讲,A ...
- 初次撸Python,踩平些小坑~
[转义字符] os.path.isdir(targetPath)总是报错,以为字符串不行而是要转成file类型,尝试了很多方法还是没解决,最后发现,windows下的路径中字符串中需要转义(例子在网上 ...
- ThinkPHP5专题
TinkPHP5中 1. model中select()后的查询结果是对象而不是数组 2. model中 假如有 $result=$this->field($fields)->where($ ...
- ZooKeeper 典型应用场景-Master选举
master选举 1.使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从 ...
- RF脚本中的坑2: pip下载python库时报certificate verify failed
用pip命令下载第三方library时,报错certificate verify failed,截图如下: 在网上找了各种教程,包括修改了pip下载源地址也无效果,最后祭出了杀手锏——FQ,FQ成功后 ...
- IOS 触摸事件的处理
触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointIn ...
- bzoj2004 [Hnoi2010]公交线路
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...
- XCode插件因为升级不能用了怎么办?几个步骤教你搞定
之前XCode安装了自动注释的插件 VVDomenter.升级之后不能使用了怎么办?跟着我做吧. 1.打开xcode插件所在的目录:~/library/Application Support/Deve ...
- 【洛谷P3818】小A和uim之大逃离 II
小A和uim之大逃离 II 题目链接 比较裸的搜索,vis[i][j]再加一层[0/1]表示是否使用过魔液 转移时也将是否使用过魔液记录下来,广搜即可 #include<iostream> ...
- Android学习笔记_4_单元测试
在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1. ...