18

I see a lot of templates and complicated data structures for implementing a circular buffer.

How do I code a simple integer circular buffer for 5 numbers?

I'm thinking in C is the most straightforward?

Thanks.

T.T.T.
  • 33,367
  • 47
  • 130
  • 168

4 Answers4

28

Have an array, buffer, of 5 integers. Have an index ind to the next element. When you add, do

buffer[ind] = value;
ind = (ind + 1) % 5;
Matthew Flaschen
  • 278,309
  • 50
  • 514
  • 539
  • 6
    From the personal experience file, you need to be careful that ind is not negative. If you change the second line to "ind = (max(0,ind) % 1) + 5;", you don't have to worry about negative values for ind. – photo_tom Sep 02 '10 at 02:40
  • 5
    Why don't you just set ind to be uint? That would solve your problem more efficiently if only additions are involved – Triskeldeian Apr 09 '16 at 09:13
12

Take an array, arr, an index idx, and a counter, num.

To insert foo, say arr[idx++] = foo; idx %= buffer_len; num++;.

To read out an item into foo, say foo = arr[(idx-num)%buffer_len]; num--;.

Add boundary checks.

Borealid
  • 95,191
  • 9
  • 106
  • 122
1

If the size and data type of your buffer are fixed, a simple array is all you need:

 int buffer[5];

Add to that a couple pointers:

 int* start = &buffer[0];
 int* end   = &buffer[4]+1;
 int* input = start;
 int* output = start;
James Curran
  • 101,701
  • 37
  • 181
  • 258
0
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);
}
qodeninja
  • 10,946
  • 30
  • 98
  • 152
Raju K
  • 17
  • 1