首页 > 其他分享 >c语言实现简单实用的循环队列

c语言实现简单实用的循环队列

时间:2023-06-25 19:13:03浏览次数:80  
标签:__ return 队列 fifo 实用 循环 FIFO data ptr

2023-06-25    https://www.cnblogs.com/NJ-Leon/

 

1. fifo.h 文件

#ifndef __FIFO_H__
#define __FIFO_H__

#define FIFO_SIZE               8

// 根据实际需要,自行修改
typedef struct {
    int16_t data_0;
    int16_t data_1;
} fifo_data_t;

typedef struct {
    uint16_t r_ptr;
    uint16_t w_ptr;
    uint16_t count;     /* number of elements in the fifo buffer */
    fifo_data_t buf[FIFO_SIZE];
} fifo_t;

extern void fifo_reset(fifo_t *fifo);
extern bool fifo_write(fifo_t *fifo, fifo_data_t w_data);
extern bool fifo_read(fifo_t *fifo, fifo_data_t *r_data);
extern bool fifo_is_empty(fifo_t *fifo);
extern bool fifo_is_full(fifo_t *fifo);

#endif // __FIFO_H__

2. fifo.c 文件

#include <stdbool.h>
#include "type_def.h"
#include "fifo.h"

/* addr: 0 - (FIFO_SIZE - 1) */
#define FIFO_ADDR(x) (((x) + 1) == FIFO_SIZE ? 0 : ((x) + 1))

void fifo_reset(fifo_t *fifo)
{
    fifo->r_ptr = 0;
    fifo->w_ptr = 0;
    fifo->count = 0;

    return;
}

bool fifo_write(fifo_t *fifo, fifo_data_t w_data)
{
    if (fifo->count >= FIFO_SIZE) {
        return false;
    }

    fifo->buf[fifo->w_ptr].data_0 = w_data.data_0;
    fifo->buf[fifo->w_ptr].data_1 = w_data.data_1;
    fifo->w_ptr = FIFO_ADDR(fifo->w_ptr);
    fifo->count++;

    return true;
}

bool fifo_read(fifo_t *fifo, fifo_data_t *r_data)
{
    if (fifo->count == 0) {
        return false;
    }

    r_data->data_0 = fifo->buf[fifo->r_ptr].data_0;
    r_data->data_1 = fifo->buf[fifo->r_ptr].data_1;
    fifo->r_ptr = FIFO_ADDR(fifo->r_ptr);
    fifo->count--;

    return true;
}

bool fifo_is_empty(fifo_t *fifo)
{
    if (fifo->count == 0) {
        return true;
    }

    return false;
}

bool fifo_is_full(fifo_t *fifo)
{
    if (fifo->count >= FIFO_SIZE) {
        return true;
    }

    return false;
}

3. main.c 测试代码

#include <stdio.h>
#include <stdbool.h>
#include "type_def.h"
#include "fifo.h"

int main()
{
    fifo_t fifo;
    fifo_data_t w_data, r_data;
    uint8_t i;

    fifo_reset(&fifo);

    printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo));
    for (i = 0; i <= FIFO_SIZE; i++) {
        w_data.data_0 = i;
        w_data.data_1 = i + 1;
        if (!fifo_write(&fifo, w_data)) {
            printf("line: %d, write failed\n", __LINE__);
        }
    }
    printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo));

    for (i = 0; i <= FIFO_SIZE; i++) {
        if (!fifo_read(&fifo, &r_data)) {
            printf("line: %d, read failed\n", __LINE__);
        } else {
            printf("line: %d, read: %d, %d\n", __LINE__, r_data.data_0, r_data.data_1);
        }
    }
    printf("line: %d, empty = %d, full = %d\n", __LINE__, fifo_is_empty(&fifo), fifo_is_full(&fifo));

   return 0;
}

4. 编译和运行结果

 

标签:__,return,队列,fifo,实用,循环,FIFO,data,ptr
From: https://www.cnblogs.com/NJ-Leon/p/17503717.html

相关文章

  • Spring三级缓存与循环依赖
    三级缓存//一级缓存,存放的是完整的beanprivatefinalMap<String,Object>singletonObjects=newConcurrentHashMap<>(256);//二级缓存,存放的是半成品的bean,未完成属性注入privatefinalMap<String,Object>earlySingletonObjects=newHashMap<>(16);//三级缓存,存放的......
  • React - 循环滚动
    1.准备工作lettimer=null;//定时器constBoxRef=useRef();//父组件refconstChildRef=useRef();//子组件ref用于包裹数据循环的const[roll,setRoll]=useState(true);//是否滚动//comments是要map的数据2.开始鼠标移入时暂停移出时开始移......
  • JS(循环)
    一for循环在程序中,一组被重复执行的语句被称之为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称之为循环语句1语法结构for循环主要用于把某些代码循环若干次,通常跟技术有关系。其语法结构如下for(初始化变量;条件表达式;操作表达式......
  • ASEMI快恢复二极管MUR80100PT功能和应用实用指南
    编辑-ZMUR80100PT是一种高性能、超快恢复二极管,设计用于各种应用,包括电源、逆变器和电机控制系统。本文将提供一个全面的指南,以了解MUR80100PT的特点和应用,以及它在提高电子设备的效率和可靠性方面的重要性。 MUR80100PT的特点 1.超快恢复时间:MUR80100PT拥有仅35ns的超快恢复时间......
  • ASEMI快恢复二极管MUR80100PT功能和应用实用指南
    编辑-ZMUR80100PT是一种高性能、超快恢复二极管,设计用于各种应用,包括电源、逆变器和电机控制系统。本文将提供一个全面的指南,以了解MUR80100PT的特点和应用,以及它在提高电子设备的效率和可靠性方面的重要性。 MUR80100PT的特点 1.超快恢复时间:MUR80100PT拥有仅35ns的超快恢......
  • Doo Prime 德璞资本:标普500期货的超实用投资攻略!
    标普500指数期货是一种非常受欢迎的期货,它基于标准普尔500指数,是一种代表美国股市的指数。因此,对于想要投资美国股市的人来说,标普500期货是非常重要的一种投资工具。在本文中,我将详细介绍标普500期货的概念、特点、投资方法和市场走势等方面,旨在让读者更好地了解并掌握这一领域的投......
  • 实用解析dmp文件内容
    配置实验环境:1.1生产三个文件expwoo/oracletable=dump_tablefile=1.dmp;expdpwoo/oracletables=dump_tabledirectory=dhomedumpfile=2.dmp;touch3.dmp2.创建随机数据SQL>createtabledump_tableas2selectrownumasid,3......
  • 新建交换机并绑定队列
    新建exchangeName:exchange_approve_carresource_message新建队列Name:clue.approve.carresource.message.queue该队列绑定到exchange_approve_carresource_messageRoutingkey:clue.approve.carresource.message.queue......
  • kafka01 kafka及消息队列简介
     1Kafka是什么Kafka是一种高吞吐量的分布式发布订阅消息系统(消息引擎系统)。 2消息系统简介一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和......
  • TensorFlow11.2 循环神经网络RNN-循环神经网络、RNN-layer实现
    循环神经网络SentimentAnalysis(情感分析)类似于淘宝的好评还是差评,我们比较直观的一个方法就是:这里不好的是:Downsides:1.Longsentence100+wordstoomuchparameters[w,b]。就是比如说我们有100个单词,会产生很多个w,b,参数太多了。2.Nocontextinformation(没有语......