2013-11-04 119 views
3

我正在尝试编写一个FIFO队列,它将数据存入并且一旦完成后释放最旧的数据以为新数据腾出空间。在c中创建一个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增加超过阵列大小。有什么办法可以解决这个问题吗?

+2

http://www.cs.bu.edu/teaching/c/queue/array/types.html – SQLMason

+0

既然你学习这么直接的代码可能不是你最好的答案。我建议你看看上面的链接和/或问你的代码的具体问题更直接的问题:)你的QFull大小检查是错误的,因此它会一旦它填满时崩溃。 –

+1

如果您的队列的大小是固定的,您可能需要考虑使用环形缓冲区。有两个指针,一个指向第一个元素,另一个指向下一个应该去的位置。当你删除一个元素时,只需增加“最后一个元素”指针;如果它等于'Q + size',则将其设置为'Q'。 – cHao

回答

0

您正试图创建一个循环队列,而无需执行额外的步骤来完成该工作。您需要这样做(如cHao所述)或使用链接列表进行调查。我建议朝循环队列工作,因为它不需要太多修改。

另外,你的if/else子句中都有相同的两行。你应该能够移动这两条线,并节省自己,如果条款。我不是100%的逻辑,所以确保它可以在if语句之前。

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