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

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

嵌入式框架Zorb Framework搭建过程

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

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

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

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

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

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

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

一、前言

  在这一篇中,我们将为Zorb Framework提供列表功能。列表是我最喜欢用的数据结构,没有之一。在只要涉及到管理对象不止一个的时候,我就会想到列表。后面将要设计的状态机、事件、定时器和任务等等都需要列表的支持,可以说列表在整个框架里边是必不可少的一个功能。

二、列表设计

  我们先来看看要实现的列表提供什么功能:

  初步要提供的功能如下:

  1、可以在指定位置增加数据

  2、可以在指定位置删除数据

  3、可以知道列表数据的个数

  4、可以清空列表

  5、可以不释放数据,仅仅把数据移出列表

  6、可以根据数据获取它所在的索引

  因此,初步设计的数据结构如下:

 1 /* 列表节点结构 */
 2 typedef struct _ListNode
 3 {
 4     bool IsExternData;          /* 是否外部数据,是则销毁时不释放 */
 5     uint8_t *pData;             /* 指向数据的指针 */
 6     uint32_t Size;              /* 数据的大小 */
 7     struct _ListNode *Next;     /* 指向下一个节点 */
 8 } ListNode;
 9
10 /* 列表结构 */
11 typedef struct _List
12 {
13     ListNode *pRootNode;        /* 指向根节点数据 */
14     uint32_t Count;             /* 节点个数 */
15
16     /* 在尾端增加节点 */
17     bool (*Add)(struct _List * const pList, ListNode *pNode);
18
19     /* 删除节点(释放空间) */
20     bool (*Delete)(struct _List * const pList, ListNode *pNode);
21
22     /* 移除节点(不释放空间) */
23     bool (*Remove)(struct _List * const pList, ListNode *pNode);
24
25     /* 返回指定索引处的节点的指针 */
26     bool (*GetElementAt)(struct _List * const pList, uint32_t index,
27         ListNode **ppNode);
28
29     /* 返回数据区指向data的节点的指针 */
30     bool (*GetElementByData)(struct _List * const pList, void *pdata,
31         ListNode **ppNode);
32
33     /* 返回指定索引处的节点的数据缓冲区的指针 */
34     void *(*GetElementDataAt)(struct _List * const pList, uint32_t index);
35
36     /* 返回节点的索引 */
37     bool (*GetElementIndex)(struct _List * const pList, ListNode *pNode,
38         uint32_t *pIndex);
39
40     /* 在指定索引处增加节点 */
41     bool (*AddElementAt)(struct _List * const pList, uint32_t index,
42         ListNode *pNode);
43
44     /* 在指定索引处删除节点(释放空间) */
45     bool (*DeleteElementAt)(struct _List * const pList, uint32_t index);
46
47     /* 在指定索引处移除节点(不释放空间) */
48     bool (*RemoveElementAt)(struct _List * const pList, uint32_t index);
49
50     /* 清空列表(释放空间) */
51     bool (*Clear)(struct _List * const pList);
52
53     /* 释放列表(释放空间) */
54     bool (*Dispose)(struct _List * const pList);
55 } List;

  为了实现动态列表,在列表中提供了一个Dispose的功能。

  列表已经设计好了,具体实现请看附件代码或在文末的github地址拉框架源码。

三、列表结果测试

  简单的测试代码如下:

  1 /**
  2   *****************************************************************************
  3   * @file    app_list.c
  4   * @author  Zorb
  5   * @version V1.0.0
  6   * @date    2018-06-28
  7   * @brief   列表测试的实现
  8   *****************************************************************************
  9   * @history
 10   *
 11   * 1. Date:2018-06-28
 12   *    Author:Zorb
 13   *    Modification:建立文件
 14   *
 15   *****************************************************************************
 16   */
 17
 18 #include "app_list.h"
 19 #include "zf_includes.h"
 20 #include "string.h"
 21
 22 /* 列表指针 */
 23 List *pBookList;
 24
 25 /* 书本数据结构 */
 26 typedef struct _Book
 27 {
 28     uint32_t Index; /* 索引 */
 29     char Name[10];  /* 书名 */
 30 } Book;
 31
 32 /******************************************************************************
 33  * 描述  :任务初始化
 34  * 参数  :无
 35  * 返回  :无
 36 ******************************************************************************/
 37 void App_List_init(void)
 38 {
 39     /* 创建列表 */
 40     List_create(&pBookList);
 41 }
 42
 43 /******************************************************************************
 44  * 描述  :任务程序
 45  * 参数  :无
 46  * 返回  :无
 47 ******************************************************************************/
 48 void App_List_process(void)
 49 {
 50     uint32_t i;
 51     ListNode *pNode;
 52     Book *pBook;
 53
 54     ZF_DEBUG(LOG_D, "book list count before adding data is %d\r\n",
 55         pBookList->Count);
 56
 57     /* 填充10个数据 */
 58     for (i = 0; i < 10; i++)
 59     {
 60         /* 创建节点 */
 61         List_mallocNode(&pNode, (void **)&pBook, sizeof(Book));
 62
 63         /* 填充节点内容 */
 64         pBook->Index = i;
 65         strcpy(pBook->Name, "book x");
 66         pBook->Name[5] = ‘0‘ + i;
 67
 68         /* 添加到列表 */
 69         pBookList->Add(pBookList, pNode);
 70     }
 71
 72     ZF_DEBUG(LOG_D, "book list count after adding data is %d\r\n",
 73         pBookList->Count);
 74
 75     /* 读出第3个数据看是否正确 */
 76     pBook = (Book *)pBookList->GetElementDataAt(pBookList, 2);
 77
 78     ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
 79     ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
 80
 81     ZF_DEBUG(LOG_D, "\r\n");
 82
 83     /* 删除第5个数据 */
 84     pBookList->DeleteElementAt(pBookList, 4);
 85
 86     ZF_DEBUG(LOG_D, "book list count after deleteing data is %d\r\n",
 87         pBookList->Count);
 88
 89     /* 显示现有数据 */
 90     for (i = 0; i < pBookList->Count; i++)
 91     {
 92         pBook = (Book *)pBookList->GetElementDataAt(pBookList, i);
 93
 94         ZF_DEBUG(LOG_D, "\r\n");
 95         ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
 96         ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
 97     }
 98
 99     while(1);
100 }
101
102 /******************************** END OF FILE ********************************/

  结果:

book list count before adding data is 0
book list count after adding data is 10
book index is 2
book name is book 2

book list count after deleteing data is 9

book index is 0
book name is book 0

book index is 1
book name is book 1

book index is 2
book name is book 2

book index is 3
book name is book 3

book index is 5
book name is book 5

book index is 6
book name is book 6

book index is 7
book name is book 7

book index is 8
book name is book 8

book index is 9
book name is book 9

四、最后

  本篇为Zorb Framework提供了列表功能,而且这个列表可以装载不同类型的数据。可以说是小功能,大作用。

  本文工程代码:3-Zorb_Framework列表的实现

  Zorb Framework github:

  版权所有,转载请打赏哟

如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟

原文地址:https://www.cnblogs.com/54zorb/p/9279805.html

时间: 2024-10-09 05:19:30

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

嵌入式linux开发环境搭建(三)——TFTP服务器的搭建

嵌入式linux开发环境搭建(三)--TFTP服务器的搭建 系统环境:Ubuntu 14.04 server amd64 1.软件安装 apt-get install tftpd tftp openbsd-inetd 2.查看修改配置文件vim /etc/inetd.conf tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp /srv/tftp为Tftp服务器根目录,可以修改为/home/tftp 3.创

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

实体框架- Entity Framework 基础篇

以前写数据层D层的时候里面有好多的SQL语句,如何省略到繁琐的SQL语句,微软提供了一种很好的方式-实体框架-Entity Framwork.一种对象映射机制,支持.NET开发人员使用域特定对象来出来关系数据,消除了对开发人员通常需要编写的大部分数据访问代码的需求. ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.实体框架Entity Framework是ADO.NET中的一组支持开发面向数据的软件

chromium嵌入式框架libcef简介

 Introduction CEF简介 The Chromium Embedded Framework (CEF) is a simple framework for embedding Chromium-based browsers in other applications. It is a BSD-licensed open source project founded by Marshall Greenblatt in 2008 and based on the Google Chr

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

iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用起来非常的难受.在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用.至于AddressBookFramework的相关api如何繁琐,在以前的博客中有记录

RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)

本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramework中如何使用Selenium进行自动化测试. 本文章节目录: 1.Get Value 2.Get Webelements和Get Webelement 3.Get Window Titles 4.Go Back 和 Go To 5.Get List Items 6.Get Selected List

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

以下由我们在信易网络公司开发项目的时候终结出的一些经验 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应用的配置文件,保存Application的各种参数,直接return数组.在使用的过程中,因为main.php文件一定会被Yii提前加载,所以将一些全局性的操作也放在了此文件,加载一些类操作啥的没有什么问题,当有一次加了一个全局变量,并且在其它地方使用global获取全局变量时,发现无论我如何努力都得到的是NULL.各种尝试后,终

嵌入式Linux C语言(三)——指针与函数

嵌入式Linux C语言(三)--指针与函数 指针对函数的功能有巨大的贡献,指针能够将数据传递给函数,并且允许函数对数据进行修改.指针对于函数的作用主要有两方面:将指针传递给函数和声明函数指针. 一.程序的栈和堆 程序的栈和堆是C语言程序运行的运行时元素. 1.程序栈 程序栈是支持函数执行的内存区域,通常和堆共享一块内存区域,通常程序栈占据内存区域的下部,堆用内存区域的上部.程序栈存放栈帧,栈帧存放函数参数和局部变量.调用函数时,函数的栈帧被推倒栈上,栈向上长出一个栈帧,当函数终止时,函数的栈帧

Go语言及Web框架Beego环境搭建手顺

本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1.windows-386.msi,对应32位windows系统安装使用 下载地址: https://code.google.com/p/go/downloads/detail?name=go1.1.2.windows-386.msi 2) go1.2rc1.windows-amd64.msi,对应32位windows系统安装使用 下载地址: https://code.google.com/p/