【问题标题】:Kind of queue Buffer for variable length messages data可变长度消息数据的队列缓冲区类型
【发布时间】:2013-01-26 23:50:17
【问题描述】:

短篇小说

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

长篇大论

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

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

谢谢

【问题讨论】:

  • @Aniket,OP 要求的是一个想法而不是代码,所以我建议不要关闭它。
  • 在数组中搜索循环队列
  • 这就是我所需要的。谢谢。

标签: c data-structures


【解决方案1】:

在这种情况下,循环缓冲区会有所帮助,只需稍作修改,即可在缓冲区满时踢出最旧的条目。假设您有一些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,允许该位置用于最新消息。

【讨论】:

  • 我知道应该已经有一些东西了。只是不知道它的名字:) 我想我将不得不审查我的数据结构。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多