C语言编写二维数组环形缓冲区

本文详细描述了如何在C语言中实现一个项目需求,通过程序不断获取360度激光雷达数据,并将其存储到一个二维浮点型环形缓冲区中,同时包含溢出检测和缓冲区满的逻辑处理。
摘要由CSDN通过智能技术生成

项目需求:
功能1:程序不断获取激光雷达数据(一个浮点型的大小为360的数组)
功能2:将获取到的雷达距离数据存放到一个环形缓冲区,该缓冲区为二维浮点数组

1. 定义二维浮点缓冲区相关变量

/* 激光雷达相关全局变量 */
#define  dataLen   360
#define  dataNum   10
float_t rplidar_ranges[dataNum][dataLen];  			 // 激光雷达数据缓冲区
float_t *rplidar_front = rplidar_ranges[0];  // 数据缓冲区头指针
float_t *rplidar_tail = rplidar_ranges[0];   // 数据缓冲区尾指针

定义 rplidar_ranges 二维数组,保存10组数据,每组360个数据
定义 rplidar_front 指针,指向二维数组中的第一个数组,代表存入数据指针
定义 rplidar_tail 指针,指向二维数组中的第一个数组,代表取出数据指针

2. 溢出检测

如果存入数据指针已经等于rplidar_ranges[dataNum - 1],则将存入数据指针赋值为rplidar_ranges[0]
如果不是,则存入数据指针正常后移一个一维数组的长度

/* 缓冲区溢出检测 */
if(rplidar_front == rplidar_ranges[dataNum - 1])
	rplidar_front = rplidar_ranges[0];
else 
	rplidar_front += dataLen;

PS:而在一维数组中则对应使用以下方法
front = (front + 1) % num

3. 检测缓冲区是否已满

如果缓冲区已满,则不继续放入数据,直到有空数组才放入
这里采取牺牲一个存储空间的方式实现,即 front + 1 是否等于 tail

// 溢出检测
#define   front_out_check()    (rplidar_front == rplidar_ranges[9] ? rplidar_ranges[0] : rplidar_front + 360)

// 缓冲区是否已满
#define   full_check()  (front_out_check()  == rplidar_tail)

if(full_check())
	printf("缓冲区已满!!!\n");

这里由于使用的是指针,所以不能采用取余数的方式进行溢出检测,所以我采用宏定义的方式,先进行溢出检测得到 “front” 后移后的值,然后再与 “tail” 进行比较

PS: 如果是一维数组,定义的 front 和 tail 是整型变量,可以直接使用
if((front + 1) % num == tail) 实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值