社区
C语言
帖子详情
求先入先出(FIFO)缓冲区算法
microchu
2005-06-30 06:34:13
缓冲区大小10M,用来存放二进制数据,缓冲区的使用遵循以下规则
1)先入先出
2)取出后的空间视为空,可以再次存放数据
请写出存取接口函数:
1)存数据函数要求第一个参数为要存入数据的大小,第二个参数为存入数据的指针
2) 取数据函数要求第一个参数为要取出数据的大小,第二个参数为存放取出数据的指针
请各位先写写看,晚上回来跟大家讨论
...全文
652
7
打赏
收藏
求先入先出(FIFO)缓冲区算法
缓冲区大小10M,用来存放二进制数据,缓冲区的使用遵循以下规则 1)先入先出 2)取出后的空间视为空,可以再次存放数据 请写出存取接口函数: 1)存数据函数要求第一个参数为要存入数据的大小,第二个参数为存入数据的指针 2) 取数据函数要求第一个参数为要取出数据的大小,第二个参数为存放取出数据的指针 请各位先写写看,晚上回来跟大家讨论
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
summercloth
2005-07-01
打赏
举报
回复
#define BUFFER_SIZE (unsigned long )10000000
unsigned char BUFFER[BUFFER_SIZE] = {0};
unsigned char *pBufferFront = (unsigned char *)BUFFER;
unsigned char *pBuffereEnd = (unsigned char *)BUFFER +BUFFER_SIZE -1;
unsigned char *pBufferCur = pBufferFront;
unsigned char Buffer_Put(unsigned long put_size,unsigned char *put_pointer)
{
unsigned long current_size;
unsigned long count;
if(put_size > (pBufferCur - pBufferFront))
return FALSE;
for(count = 0;count<put_size;count++)
*pBufferCur-- = *put_pointer++;
}
unsigned char Buffer_Get(unsigned long get_size,unsigned char *get_pointer)
{
unsigned long count;
unsigned char *move_pointer = pBuffereEnd;
if(get_size>BUFFER_SIZE- pBufferCur)
return FALSE;
for(count = 0;count<get_size;count++)
*get_pointer++ = *move_pointer--;
for(count = 0,pBufferCur = pBuffereEnd;count < move_pointer - pBufferCur;count++)
*pBufferCur-- = *move_pointer--;
return TRUE;
}
look01
2005-07-01
打赏
举报
回复
待会帮你看看,呵呵!
microchu
2005-06-30
打赏
举报
回复
这个题目,我觉得看上去像是循环队列,但是不能用链表实现,或者说用链表实现不简单。
因为循环队列链表算法是单个存入或取出对象,本例则是一次存取指定Size大小的数据量,
在边界上存取数据是本例的一个难点。
boxban
2005-06-30
打赏
举报
回复
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;
class MyBuf
{
public:
MyBuf(int n = 10 * 1024 * 1024)
{
assert (n > 0);
m_buf = new char[n];
m_head = m_buf;
m_size = 0;
m_capacity = n;
}
~MyBuf() { delete []m_buf;}
public:
int write(int size, const char* data);
int read(int size, char* buf);
private:
const char* getBufferEnd() const { return (m_buf + m_capacity); }
private:
char* m_buf;
char* m_head;
int m_size;
int m_capacity;
};
//return size if OK. -1 means overflow.
int MyBuf::write(int size, const char* data)
{
assert(size > 0);
if ((size + m_size) > m_capacity) return -1;
int tailBytes = getBufferEnd() - (m_head + m_size);
if (tailBytes >= size){
memcpy(m_head + m_size, data, size);
}else{
if (tailBytes > 0){
memcpy(m_head + m_size, data, tailBytes);
memcpy(m_buf, data + tailBytes, size - tailBytes);
}else{
memcpy(m_buf - tailBytes, data, size);
}
}
m_size += size;
return size;
}
int MyBuf::read(int size, char* buf)
{
assert(size > 0);
if (size > m_size) return -1;
int n = getBufferEnd() - m_head;
if (n >= size){
memcpy(buf, m_head, size);
m_head += size;
}else{
memcpy(buf, m_head, n);
memcpy(buf + n, m_buf, size - n);
m_head = m_buf + size - n;
}
m_size -= size;
if (m_size == 0) m_head = m_buf;
return size;
}
int main()
{
MyBuf buf(12);
char tmp[100];
buf.write("abchello", (int)sizeof("abchello") - 1);
buf.read(tmp, 3);
tmp[3] = 0;
cout << tmp << endl;
buf.write(" world!", (int)sizeof(" world!") - 1);
buf.read(tmp, 12);
tmp[12] = 0;
cout << tmp << endl;
return 0;
}
ericqxg007
2005-06-30
打赏
举报
回复
刚开始看题目还以为是什么东西 仔细看还是数据结构的东西
楼主 这个题目就是要你建立队列 而且使用线性实现的
megaboy
2005-06-30
打赏
举报
回复
这就是队列嘛,一个FIFO的动态链表就得了。
microchu
2005-06-30
打赏
举报
回复
顶,还有没有更好的
arduino笔记37:nrf24l01的数据
缓冲区
(TX
FIFO
、RX
FIFO
)
从本节开始,关于nrf24l01使用,我只会讲和【Enhanced ShockBurst(增强型短时猝发工作模式)】有关的内容 【Enhanced ShockBurst】就是前面屡次提到的【自动回复】工作模式的官方称呼。 所以那种使用PTX/PRX身份互换而实现双向通信的方式就不会做太多涉及了,因为这两种模式对模块的使用差别非常大,交叉写的话可能会对初学的同学造成困扰,对期待这部分内容的同学表示抱歉。 而其实,对于PTX/PRX身份互换双向通信的方式,当你对通信可靠性(丢包/确认/超时/重...
一个先入
先出
队列
先入
先出
队列一个先入
先出
队列 一个先入
先出
队列 看书的时候看到了这个,先把他写在这。作为一个归类吧。利用一个数组提供循环
缓冲区
来容纳数据。 class Queue { private int[] data = null; private int head = 0, tail = 0; private const int MaxSize...
UART的
FIFO
功能
经常听到UART的
FIFO
功能,但是从来没有真正使用过和认真思考过它的作用。正好有客户用到这个功能,在这里做个总结。
FIFO
是“First-In First-Out”的缩写,它是一个具有先入
先出
特点的
缓冲区
。串口设计
FIFO
的目的是为了提高串口的通讯性能。如果没有
FIFO
或者说
缓冲区
的长度只有1字节,那么使用接收中断,就意味着每次收到一个字节的数据就要进一次中断,这样频繁进中断会占用CPU资源...
FlexCAN接收机制深度解析:
FIFO
与消息
缓冲区
匹配
算法
在嵌入式系统与汽车电子领域,CAN总线是设备间通信的核心协议,其控制器负责物理信号与数据帧的转换。理解CAN控制器的接收机制,关键在于掌握其数据帧的匹配与存储原理。FlexCAN模块通过灵活的消息
缓冲区
与接收
FIFO
设计,实现了高效的数据接收与处理。消息
缓冲区
如同专属邮箱,通过精确ID匹配实现确定性接收;而接收
FIFO
则利用先入
先出
队列和强大的ID过滤表,能高效处理大量分散ID的报文,显著减轻CPU中断负载。其核心匹配
算法
在CRC校验期间执行,遵循
FIFO
优先、再扫描常规
缓冲区
的顺序,并引入“空闲可接收”状
【STM32】UART通信-
FIFO
形式-个人理解
FIFO
作为
缓冲区
,一方面,当STM32正在处理上接收到的数据时,此时有数据发送过来,会将其存入
FIFO
缓冲区
,待STM32处理结束后,从
FIFO
缓冲区
读取数据,继续进行处理,因此不用担心由于数据处理不及时而导致上位机发送给下位机的数据丢失;另一方面,当STM32正在发送数据时,STM32只需要读取
FIFO
缓冲区
数据,赋值给发送寄存器,待发送成功后,进入串口中断读取
FIFO
缓冲区
数据,赋值给发送寄存器,如此反复,直至
FIFO
缓冲区
为空。在
缓冲区
仍有数据的时间里,STM32可以去处理其他事情,不用等待数据发完
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章