嵌入式框架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一般会作为整个应 ...
随机推荐
- solidity语言9
输入参数 pragma solidity ^0.4.16; contract Simple { function taker(uint _a, uint _b) public pure { // do ...
- MonkeyRunner之MonkeyRecorder录制回放脚本
MonkeyRunner强大的功能之一便是允许用户自由录制需要的脚本,录制和回放需要两个脚本文件 monkey_recorder.py和monkey_playback.py 首先来看 monkey_r ...
- 在同一网关下ping不通其他电脑
最近在做数据库相关的程序,所以想先用ping试下和主机连没连着,但发现虽然两台电脑在同一网关下,但却互相ping不通,后来才发现,原来是防火墙在作怪. Omg!感慨一下!默认的情况下,保守的windo ...
- 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮
我的同事问我,为什么有的系统看不到下图7的按钮? 对比两张图里工具栏的差异. 答案 这是因为在图2(看不见Enhance Component按钮)的系统里,该系统的类型被设置为"SAP&qu ...
- 【洛谷T37388】P哥破解密码
原题图: 看到这个题,首先想到的当然是暴力打表找规律了 表: 1 2 2 4 3 7 4 13 5 24 6 44 7 81 8 149 9 274 10 504 11 927 12 1705 13 ...
- [luoguP3325][HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- c语言描述的双向链表的基本操作
#include<stdio.h> #include<stdlib.h> #define ok 1 #define error 0 typedef int Status; ty ...
- springboot缓存的使用
spring针对各种缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现.并且也可以方便的更改缓存的具体实现,而不用修改业务代码.下面对于在springboot中 ...
- Openresty最佳案例 | 第6篇:OpenResty连接Mysql
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616698 本文出自方志朋的博客 centos 安装mysl Centos系统下安装my ...
- 买手机时几GB+几GB啥意思
48GB 就是你每次下载手机软件呀.浏览图片呀.这些东西都放在48G里.你每次查看手机内存,就会看到你的48G用了多少.但是你什么时候看到你的4GB用了多少,都是那些360加速球呀提示你手机内存占用过 ...