Как мне кодировать простой целочисленный круговой буфер в C / C ++? - PullRequest
18 голосов
/ 02 сентября 2010

Я вижу много шаблонов и сложных структур данных для реализации циклического буфера.

Как мне кодировать простой целочисленный круговой буфер для 5 чисел?

Я думаю, что C - самый простой?

Ответы [ 4 ]

27 голосов
/ 02 сентября 2010

Имеет массив, buffer, из 5 целых чисел.Иметь индекс ind для следующего элемента.Когда вы добавляете, сделайте

buffer[ind] = value;
ind = (ind + 1) % 5;
11 голосов
/ 02 сентября 2010

Возьмите массив arr, индекс idx и счетчик num.

.

Чтобы вставить foo, скажем arr[idx++] = foo; idx %= buffer_len; num++;.

Чтобы прочитать элемент в foo, произнесите foo = arr[(idx-num)%buffer_len]; num--;.

Добавить проверку границ.

1 голос
/ 02 сентября 2010

Если размер и тип данных вашего буфера фиксированы, вам нужен простой массив:

 int buffer[5];

Добавьте к этому пару указателей:

 int* start = &buffer[0];
 int* end   = &buffer[4]+1;
 int* input = start;
 int* output = start;
0 голосов
/ 29 июня 2014
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);
}
...