我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。

嵌入式框架Zorb Framework搭建过程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

嵌入式框架Zorb Framework搭建三:列表的实现

嵌入式框架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搭建三:列表的实现的更多相关文章

  1. 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  2. 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  3. 嵌入式框架Zorb Framework搭建四:状态机的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  4. 嵌入式框架Zorb Framework搭建五:事件的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  5. 嵌入式框架Zorb Framework搭建六:定时器的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  6. 嵌入式框架Zorb Framework搭建七:任务的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  7. iOS9全新的联系人相关框架——Contacts Framework

    iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...

  8. 最新 iOS 框架整体梳理(三)

    这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3     ...

  9. 使用Yii框架中遇到的三个问题

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 使用Yii框架中遇到的三个问题 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应 ...

随机推荐

  1. Win7 自带FTP将文件复制到FTP服务器时发生错误。

    错误截图: 错误信息: 将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上. 详细信息: 200 Type set to I. 200 PORT commad successfu ...

  2. 自动驾驶self driving知识点mark

    C++, algorithm, RTOS,TX2, CAN, 标准, car model,

  3. Android仿QQ复制昵称效果

    本文同步自http://javaexception.com/archives/76 背景: 这几天做一个复制文本的需求,突然看到QQ上复制昵称跟QQ号的效果,觉得很不错,就想要模仿一波,办法比较简单粗 ...

  4. 【luogu P3884 [JLOI2009]二叉树问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3884 对方不想和你说话并向你扔了一个lca模板. #include <cstdio> #incl ...

  5. EJB结合struts2创建项目、发布jboss服务器和访问、父类(BaseDaoImpl)的封装

    一.环境搭建: 1.准备jboss服务器,将对应数据库的xml配置好放到jboss的发布目录下. <?xml version="1.0" encoding="UTF ...

  6. HDU 1210 Eddy's 洗牌问题(找规律,数学)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1210 Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Other ...

  7. java循环作业0912

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? double a = 0.08; double h =0; int i=0; for(i=1;h&l ...

  8. 轻量ORM-SqlRepoEx 重大升级

    .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,支持MySQL.SQL Server数据库方言,使用强类型操作数据的轻量级ORM工具,在减少魔法 ...

  9. Android 初步-Android文件目录介绍

    src:存放的是应用程序使用到的java文件. gen:系统自动生成的目录,不需要程序员进行修改,包含了R.java文件.该文件包含了 程序使用到的资源文件对应的唯一资源ID,注意:如果R文件生成错误 ...

  10. Hibernate学习第一天

    Hibernate框架第一天 今天任务 1. 使用Hibernate框架完成对客户的增删改查的操作 教学导航 1. 能够说出Hibernate的执行流程 2. 能够独立使用Hibernate框架完成增 ...