How do I code a simple integer circular buffer in C/C++?

后端 未结 4 1282
长发绾君心
长发绾君心 2021-02-05 08:54

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\

相关标签:
4条回答
  • 2021-02-05 09:29

    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;
    
    0 讨论(0)
  • 2021-02-05 09:36
    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);
    }
    
    0 讨论(0)
  • 2021-02-05 09:38

    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;
    
    0 讨论(0)
  • 2021-02-05 09:44

    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.

    0 讨论(0)
提交回复
热议问题