【问题标题】:Creating a FIFO queue in c在c中创建一个FIFO队列
【发布时间】: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;。)

标签: c arrays queue fifo


【解决方案1】:

What Dan said,你真的不能在return 后面加上语句;他们不会被处决。

【讨论】:

    【解决方案2】:

    您正在尝试创建一个循环队列,而无需执行额外的步骤来使其正常工作。您要么需要这样做(如 cHao 所述),要么考虑使用链表。我建议使用循环队列,因为它不需要太多修改。

    此外,您的两个 if/else 子句中有相同的两行。您应该能够将这两行移出并保存 if 子句。我不是 100% 理解你的逻辑,所以请确保它可以放在 if 语句之前。

    int Qinsert()
    {
        r++;
        Q[r]=SPI1BUF;
        if(Qfull())
        {
        //...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      相关资源
      最近更新 更多