【发布时间】:2013-11-15 07:28:36
【问题描述】:
我正在尝试编写一个 FIFO 队列,该队列接收数据并在满后释放最旧的数据,以便为新数据腾出空间。
我是编程新手,但设法想出了以下代码:
int Q[size], f=0, r=-1;
int Qfull()
{
if (r==size) return 1;
return 0;
}
int Qinsert()
{
if(Qfull())
{
elem=Q[f];
f=f+1;
return elem;
r++;
Q[r]=SPI1BUF;
}
else
{
r++;
Q[r]=SPI1BUF;
}
}
我遇到的问题是,这不会移动数据,并且一旦数组已满,由于 r 增加超过数组大小,它将失败。有没有办法解决这个问题?
【问题讨论】:
-
由于您正在学习,因此直接代码可能不是您的最佳答案。我建议您查看上面的链接和/或就您的代码的具体问题提出更直接的问题 :) 您的 QFull 大小检查是错误的,因此一旦填满它就会崩溃。
-
如果您的队列大小固定,您可能需要考虑使用环形缓冲区。有两个指针,一个指向第一个元素,一个指向下一个元素的位置。当您删除一个元素时,只需增加“最后一个元素”指针;如果它等于
Q+size,则将其设置为Q。 -
(你也可以使用数组索引,这样会更容易。然后你可以说
next = (next + 1) % size;。)