gpt4 book ai didi

c - 可变长度消息数据的队列缓冲区的种类

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:11 25 4
gpt4 key购买 nike

短篇小说

我需要将传入的消息数据添加到固定长度的缓冲区。
如果缓冲区已满,则用新数据替换最旧的消息数据(或缓冲区中最旧的字节)。这是某种队列。
如何实现这种队列?
程序是用 C 编写的,我对 C 几乎一无所知。

说来话长

我有一个程序正在从设备接收消息。
此消息可能具有可变长度并具有关联的 ID。
目前该程序只保留每个 Id 收到的最新消息。
此消息由程序内部保存,并且仅在有配置时显示给用户,或者如果他发送命令(实时)以获取给定 ID 的接收消息。
现在需要保留给定 Id 的几条接收到的消息(不仅仅是最后一条)并返回它们。它们不需要单独退回。它们可以在一个 block 中全部返回(在几条消息中将其视为设备正在返回的一段内存数据)。
目前有一个固定长度的缓冲区来保存接收到的消息,还有一个变量来跟踪接收到的消息长度。
所以我在考虑使用现有缓冲区并不断向其中添加新消息。如果另一条消息出现并且缓冲区中没有剩余空间,那么我应该覆盖最旧的消息数据。有点像队列。
特别是实现这种队列的最后一部分是我需要更多帮助的地方。
该程序是用 C 编写的,不是我做的,我对 C 的了解有限(不能说不存在 :)
我真的应该先学习 C,但现在没时间了 :)我已经完成了 C#、Java、Javascript 等大部分工作。

对管理这个队列之王有什么帮助吗?

谢谢

最佳答案

在这种情况下,循环缓冲区会有所帮助,稍作修改后,您可以在缓冲区满时踢出最旧的条目。假设您有一些 typedef struct msg {...} msg 和一个数组 message[N],然后您管理两个索引,int in , out 都初始化为 0.

out != in 时,您可以从这个数组中读取消息。您可以使用某种形式的 out = (++ out) % N;inout 的递增实现为回绕。到目前为止,这与任何其他循环缓冲区没有什么不同。

现在,让我们解决在缓冲区已满的情况下替换最旧消息的问题,即当 (in + 1) % N == out 在您即将执行插入。使用循环缓冲区,这现在非常简单。为了腾出空间,out 向前推了一个,让您无论如何都可以递增 in,然后插入:

if (((in + 1) % N) == out)
{
out = (++ out) % N;
}
in = (++ in) % N;
message[in] = incoming_msg;

将阅读器的索引out 向前推,允许这个位置用于最近的消息。

关于c - 可变长度消息数据的队列缓冲区的种类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14542838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com