2010-09-01 15 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); 
}