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

嵌入式框架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. 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)

    先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...

  2. ring0 关于SSDTHook使用的绕过页面写保护的原理与实现

    原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设 ...

  3. pl/sql 存储过程执行execute immediate 卡住

    在存储过程中,执行了create table.update table.insert into table 但是在使用pl/sql的存储过程调试的时候,一有问题就直接卡住(标识:执行中.....) 后 ...

  4. libxml的使用 编辑节点

    libxml读取的基本功能已经介绍过了,现在将介绍libxml编写的基本功能. 编写操作包含节点的添加,删除和修改. 对于添加,我们需要调用xmlNewTextChild函数来添加节点,需要xmlNe ...

  5. python:线程进阶

    1,守护线程 import time from threading import Thread def func(): print('开始执行子线程') time.sleep(3) print('子线 ...

  6. UVA 12333 大数,字典树

    题意:给一个数字,看他最小是第几个菲波那切数列的前缀. 分析: 大数模板就是吊哦. 将菲波那切数列前500个数字放到字典树上.注意插入的时候不能像普通一样,只在尾节点处标记,而是一路标记下去. #in ...

  7. c#加一个后台线程

  8. 利用babel自动编译es6文件

    一.检查File-Watchers中Babel的Arguments,有一项presets的设置,把他更改为=es2015,详细设置如下: $FilePathRelativeToProjectRoot$ ...

  9. VS中添加预处理宏的方法

    VS中添加预处理宏的方法 除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义: 1.若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c+ ...

  10. python-函数的使用

    一.函数的定义 首先,我们来看一个简单的例子来定义函数: def test(): print('hello') 在其中 def  : 关键字,用来告诉解释器,接下来的一段代码是一个函数 test : ...