2010-09-01 105 views
16

我看到很多用于实现循环缓冲区的模板和复杂的数据结构。如何在C/C++中编写简单的整型循环缓冲区?

如何为5个数字编码一个简单的整数循环缓冲区?

我在C的思想是最直截了当的?

谢谢。

+7

代码的复杂性随着您希望它的安全性和可靠性而提高。例如,你想要防止下溢/溢出吗? – 2010-09-01 20:38:28

+3

注意:圆形(环形)缓冲区不同于循环*队列*。 – 2010-09-01 20:42:32

+0

我只需要存储一些数据的最后5个值,所以有更好的设计可以做到这一点。 – 2010-09-01 20:43:39

回答

25

有一个数组,buffer,有5个整数。有一个索引ind到下一个元素。当您添加,做

buffer[ind] = value; 
ind = (ind + 1) % 5; 
+6

从个人体验文件中,您需要注意ind不是负面的。如果将第二行更改为“ind =(max(0,ind)%1)+ 5;”,则不必担心ind的负值。 – 2010-09-02 02:40:01

+2

你为什么不只是将ind设置为uint?如果仅涉及添加,这将更有效地解决您的问题 – Triskeldeian 2016-04-09 09:13:56

1

如果你的缓冲区的大小和数据类型是固定的,一个简单的数组是所有你需要:

int buffer[5]; 

再加上一对夫妇指针:

int* start = &buffer[0]; 
int* end = &buffer[4]+1; 
int* input = start; 
int* output = start; 
11

取一个数组,arr,索引idx,以及一个计数器num

插入foo,比如arr[idx++] = foo; idx %= buffer_len; num++;

读出一个项目到foo,说foo = arr[(idx-num)%buffer_len]; num--;

添加边界检查。

+0

您不需要num和idx。 – user3467349 2015-03-12 22:48:51

1
int rI =0; 
int wI=0; 
#define FIFO_SIZE 3 
int checkAvail() 
{ 
int avail=0; 

if(wI<rI) 
    avail= (rI-wI); 
else 
    avail = (FIFO_SIZE-wI+rI); 
return avail; 
} 

int addFIFO(int *a, int val) 
{ 
if(checkAvail()>0) 
{ 
    a[wI]=val; 
    wI++; 
    if(wI>FIFO_SIZE) 
     wI=0; 
} 
else 
{ 
    printf("FIFO full"); 
} 
return 0; 
} 
int remFIFO(int *a) 
{ 
int val; 
if((FIFO_SIZE-checkAvail()>0)) 
{ 
    val =a[rI]; 
    rI++; 
    if(rI>FIFO_SIZE) 
     rI=0; 
} 
else 
{ 
    printf("FIFO empty"); 
} 
return 0; 
} 
int main(array<System::String ^> ^args) 
{ 
int FIFO_ARRAY[FIFO_SIZE]={}; 
addFIFO(FIFO_ARRAY,1); 
addFIFO(FIFO_ARRAY,2); 
addFIFO(FIFO_ARRAY,3); 
addFIFO(FIFO_ARRAY,4); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
remFIFO(FIFO_ARRAY); 
}