一个简单循环队列的实现

一个简单循环队列的实现
在线验证链接:https://onlinegdb.com/gpGlm4BV0

/******************************************************************************* @Brief A simple circle fifo* @Data 23/12/07* @Author zxk* @File name z_fifo.c
*******************************************************************************/
#include <stdio.h>
#include <string.h>typedef unsigned char u8;
typedef signed char s8;typedef struct {u8 size;    // 单个元素占用空间u8 num;     // 元素个数u8 w_ind;   // 写入索引u8 r_ind;   // 读出索引u8 * p;     // 缓存池首地址
} z_fifo_t;#define Z_FIFO_NUM          8 /* must be 4, 8, 16, 32 ... else need to change "zzz" lines */
#define Z_FIFO_SIZE         32 unsigned char fifo_pool_buff[Z_FIFO_NUM*Z_FIFO_SIZE] = {0};z_fifo_t test_fifo = {.size = Z_FIFO_SIZE,.num = Z_FIFO_NUM,   .w_ind = 0,.r_ind = 0,.p = fifo_pool_buff,
};void z_fifo_init(z_fifo_t *f, u8 size, u8 num, u8 *p_buff)
{f->size = size;f->num = num;f->w_ind = 0;f->r_ind = 0;f->p = p_buff;
}/***  @brief  恢复队列到初始状态*/
void z_fifo_rst(z_fifo_t * f)
{f->w_ind = 0;f->r_ind = 0;
}/***  @brief  获取队列未使用元素个数*/
u8 get_fifo_remain_num(z_fifo_t *f)
{return f->num - (f->w_ind - f->r_ind);
}/*** @brief   如果队列未满则入队列* @ret     0: succ,   -1: fifo is full,   -2: parameter err.*/
s8 z_fifo_push(z_fifo_t *f, u8 *push_data, u8 push_len)
{// count offsetu8 * p_wr = f->p + (f->w_ind & (f->num - 1)) * f->size; // zzz // fifo is full  if(f->w_ind - f->r_ind >= f->num){return -1;}// data's point is NULLif(push_data == NULL){return -2;}// exceed cell's sizeif(push_len > f->size){return -2;}// copy push_datamemcpy(p_wr, push_data, push_len);// updata write indexf->w_ind++;return 0;
}/*** @brief 队列没满 正常入队列等同于z_fifo_push, 队列已满则弹出当前队列第一个元素* @ret     0: succ,    -1: parameter err.*/
s8 z_fifo_pop_push(z_fifo_t *f, u8 *push_data, u8 push_len)
{u8 *p_wr = f->p;// data's point is NULLif(push_data == NULL){return -2;}// exceed cell sizeif(push_len > f->size){return -2;}p_wr += (f->w_ind & (f->num - 1)) * f->size; // zzz// Processing when the fifo is already full.if(f->w_ind - f->r_ind >= f->num){f->r_ind = f->w_ind - f->num + 1;}memcpy(p_wr, push_data, push_len);f->w_ind++;return 0;
}/*** @brief pop one cell from the fifo* @ret 0 fifo is not empty,    -1 fifo is empty    -2 err sta*/
s8 z_fifo_pop(z_fifo_t *f)
{if((f->w_ind - f->r_ind) > f->num){// It's not supposed to run here.f->r_ind = f->w_ind - f->num + 1; // err sta: make it equal to last indexreturn -2;}else if(f->w_ind == f->r_ind){return -1;}else{f->r_ind ++;return 0;}
}/*** @brief get the last cell from the fifo* @ret 0 fifo empty  else fifo data's point*/
u8 *z_fifo_get(z_fifo_t *f)
{if(f->r_ind != f->w_ind){u8 *p = f->p + (f->r_ind & (f->num - 1)) * f->size; // zzzreturn p;}return 0;
}int main(void)
{/* 元素个数8  单个元素占用空间32 */z_fifo_t *p_fifo = &test_fifo;u8 ii = 0;s8 ret = 0;u8 buff_set[16] = {0};u8 *buff_get = NULL;printf("!!! z_fifo test start ...... \n");for(ii = 0; ii < 9; ii++){memset(buff_set,ii,sizeof(buff_set));ret = z_fifo_push(p_fifo, buff_set, sizeof(buff_set));printf("push fifo ind:%d ret = %d\n",ii,ret);buff_get = z_fifo_get(p_fifo);if(buff_get != NULL){printf("[%02d] get fifo data:%02d,%02d,%02d,%02d,  %02d,%02d,%02d,%02d\n",ii,buff_get[0],buff_get[1],buff_get[2],buff_get[3],  buff_get[4],buff_get[5],buff_get[6],buff_get[7]);z_fifo_pop(p_fifo);}else{printf("\nfifo is empty.\n");}}printf("------------- 1 ----------------\n\n");for(ii = 0; ii < p_fifo->num*2 ; ii++){memset(buff_set,ii,sizeof(buff_set));z_fifo_pop_push(p_fifo, buff_set, sizeof(buff_set));buff_get = z_fifo_get(p_fifo);if(buff_get != NULL){printf("[%02d] remain num:%d,get fifo data:%02d,%02d,%02d,%02d,  %02d,%02d,%02d,%02d\n", ii,get_fifo_remain_num(p_fifo),buff_get[0],buff_get[1],buff_get[2],buff_get[3],  buff_get[4],buff_get[5],buff_get[6],buff_get[7]);// @test not pop    z_fifo_pop(p_fifo);}else{printf("\nfifo is empty.\n");}}printf("------------- 2 ----------------\n\n");if(get_fifo_remain_num(p_fifo) == 0){printf("fifo is full.\n");}for(ii = 0; ii < p_fifo->num; ii ++){ret = z_fifo_pop(p_fifo);if(0 == ret){buff_get = z_fifo_get(p_fifo);if(buff_get != NULL){printf("[%02d] get fifo data:%02d,%02d,%02d,%02d,  %02d,%02d,%02d,%02d\n", ii,buff_get[0],buff_get[1],buff_get[2],buff_get[3],  buff_get[4],buff_get[5],buff_get[6],buff_get[7]);}else{printf("\nfifo is empty.\n");}}else if(-1 == ret){ printf("the fifo to be poped is empty.\n");}else if(-2 == ret){printf("pop fifo err.\n");}}printf("------------- 3 ----------------\n\n");printf("\n!!! z_fifo test over.\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】2703. 返回传递的参数的长度

返回传递的参数的长度 题目题解 题目 请你编写一个函数 argumentsLength&#xff0c;返回传递给该函数的参数数量。 示例 1&#xff1a; 输入&#xff1a;args [5] 输出&#xff1a;1 解释&#xff1a; argumentsLength(5); // 1只传递了一个值给函数&#xff0c;因此它应返…

zabbix、netdata和glances,做最简单的系统资源监控

软件需要显示服务器的资源信息&#xff08;CPU、内存、网络、硬盘等&#xff09;&#xff0c;但是软件是在Docker容器中运行。 目前方案 通过ssh在主机上远程运行ps、free等指令&#xff0c;获取相应的信息。这种方案需要代码配置主机的IP&#xff0c;以及用户名和密码&#…

干爆ChatGPT,谷歌发布新大模型:Gemini

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 谷歌昨天又发布了一个新的大模型&#xff0c;叫Gemini(双子座时代)。打开Google AI 就能看到。 据说非常强&#xff0c;然后是一大堆夸奖&#xff0c;大概是本月中旬的时候正式推出。标题明晃晃写…

gcc安全特性之变量初始化检查

GCC的变量初始化检查特性旨在减少未初始化变量对程序行为和安全性的潜在影响。本文简要介绍该特性原理和使用方法。 1. 功能 变量初始化检查特性通过在编译过程中静态分析源代码来检测未初始化的变量&#xff0c;并在发现未初始化变量时发出警告。这有助于开发人员在编译时发…

Java UDP 多人聊天室简易版

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

GO设计模式——13、享元模式(结构型)

目录 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式的核心角色&#xff1a; 优缺点 使用场景 注意事项 代码实现 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式&#xff08;Flyweight Pattern&#xff09;它通过共享对象来减少内存使用和提…

Rask AI引领革新,推出多扬声器口型同步技术,打造本地化内容新纪元

“ Rask AI是一个先进的AI驱动视频和音频本地化工具&#xff0c;旨在帮助内容创作者和公司快速、高效地将他们的视频转换成60多种语言。通过不断创新和改进产品功能&#xff0c;Rask AI正塑造着未来媒体产业的发展趋势。 ” 在多语种内容创作的新时代&#xff0c;Rask AI不断突…

Day53力扣打卡

打卡记录 重新规划路线&#xff08;dfs&#xff09; 链接 class Solution:def dfs(self, x: int, parent: int, e: List[List[List[int]]]) -> int:res 0for edge in e[x]:if edge[0] parent:continueres edge[1] self.dfs(edge[0], x, e)return resdef minReorder(se…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中&#xff0c;我们将使用python3作为代码语言。 步骤图例1、入口2、创建&#xff08;我们选择使用python3.7&#xff09;3、IAM权限&#xff08;…

TDengine统计数据库占用空间

TDengine 目前只提供统计超级表占用空间的工具&#xff1a; 2.x 版本使用 select _block_dist() from STABLE_NAME3.x 版本使用 show table distributed STABLE_NAME 但以上的统计结果并不准确。 如果想统计 DB 使用的空间&#xff0c;只能通过统计所属 vnode 占用空间进行统…

PHP代码检查网站是否能正常打开,检查ssl证书

检查公司网站能否正常打开和检查SSL证书是否过期的重要性不容忽视。公司网站众多, 人工一个个去检查太费时费力, 所以用定时任务跑代码去检查; 1 检查公司网站能否正常打开 对于一个企业来说&#xff0c;网站是其在线形象和客户联系企业的主要途径。如果网站无法正常打开&…

第二十一章——网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

uniapp 显示文件流图片

如果是需要将文件流保存到相册&#xff0c;可以先转base64.详情见>uniapp app将base64保存到相册,uniapp app将文件流保存到相册-CSDN博客 uni.request({url: "www.baidu.com",data: {},header: {content-type:application/json,Authorization: "token"…

展望2024年供应链安全

2023年是开展供应链安全&#xff0c;尤其是开源治理如火如荼的一年&#xff0c;开源治理是供应链安全最重要的一个方面&#xff0c;所以我们从开源治理谈起。我们先回顾一下2023的开源治理情况。我们从信通院《2023年中国企业开源治理全景观察》发布的信息。信通院调研了来自七…

渐进式web全栈blazor web

渐进式 vue是渐进式web前端框架&#xff0c;所谓的渐进式就是你不用一开始就整个项目全部使用vue&#xff0c;因为开始你可能并不熟悉vue&#xff0c;而是开始只使用vue的些简单功能&#xff0c;慢慢用它更复杂更好的功能&#xff0c;最终项目可能完全使用vue。 渐进式blazor…

1+x网络系统建设与运维(中级)-练习题4

一.设备命名 LSW1 <Huawei>sys [Huawei]sysn LSW1 [LSW1]un in en 同理可得&#xff0c;给所有设备如以上命令一样配置 二.VLAN LSW1 [LSW1]vlan ba 1 10 20 100 [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type trunk [LSW1-GigabitEthernet0/0/1]port tru…

K线图详解

K线图是一种常用于股票、外汇和数字货币等金融市场的图表形式&#xff0c;它提供了价格走势的可视化展示。每根K线代表了一个特定时间周期内的价格变动情况。 每根K线由四个关键价格构成&#xff1a;开盘价&#xff08;Open&#xff09;、收盘价&#xff08;Close&#xff09;…

Redis 环境搭建

文章目录 第1关&#xff1a;Redis 环境搭建 第1关&#xff1a;Redis 环境搭建 编程要求 根据上述相关知识&#xff0c;在右侧命令行中完成 Redis 集群的部署与安装。 安装完成后&#xff0c;使用 echo “cluster nodes”|redis-cli -p 7001 -c >/root/test.txt 将结果保存。…

@德人合科技 | 数据透明加密防泄密系统\文件文档加密\设计图纸加密|源代码加密防泄密软件系统,——防止内部办公终端核心文件数据/资料外泄!

一款专业的数据防泄密管理系统&#xff0c;它采用了多种加密模式&#xff0c;包括透明加密、半透明加密和落地加密等&#xff0c;可以有效地保护企业的核心数据安全。 PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee …

【前端】没有了element时,怎么实现一个自己的form表单组件和表单校验(用法参考el-form)

需求 平时用习惯了el-form做表单校验&#xff0c;等到做小程序是&#xff0c;不能用element了很不习惯&#xff0c;准备自己手撸一个form表单组件做平替。 代码 form.vue <template><div class"cwx-form" ref"myForm"><slot></sl…