Veo un montón de plantillas y complicadas estructuras de datos para la implementación de un buffer circular.

¿Cómo puedo código de un simple entero buffer circular de 5 números?

Estoy pensando en C es el más sencillo?

Gracias.

  • La complejidad del código sube con la forma segura y robusta usted quiere que sea. Lo quieres para prevenir subdesbordamiento/desbordamiento, por ejemplo?
  • Nota: una circular (anillo) de búfer es diferente a la de una cola circular.
  • Sólo necesito para almacenar los 5 últimos valores de algunos de los datos, así que lo que tiene un mejor diseño para hacer eso.
  • ¿Usted necesita para recuperar de ellos en un orden especial (FIFO, LIFO, sin orden) ?
InformationsquelleAutor T.T.T. | 2010-09-01

4 Comentarios

  1. 27

    Tiene una matriz, buffer, de 5 números enteros. Tiene un índice ind al siguiente elemento. Al agregar, hacer

    buffer[ind] = value;
    ind = (ind + 1) % 5;
    • A partir de la experiencia personal de archivo, usted necesita tener cuidado de que el ind no es negativo. Si cambio la segunda línea de «ind = (max(0,ind) % 1) + 5;», usted no tiene que preocuparse acerca de los valores negativos para la ind.
    • ¿Por qué no acaba de establecer ind uint? Que podría resolver su problema de manera más eficiente si sólo adiciones están involucrados
  2. 11

    Tomar una matriz, arr, un índice idx, y un contador, num.

    Para insertar foo, decir arr[idx++] = foo; idx %= buffer_len; num++;.

    A leer un artículo en foo, decir foo = arr[(idx-num)%buffer_len]; num--;.

    Agregar comprobaciones de límites.

    • Usted no necesita num y idx.
  3. 1

    Si el tamaño y el tipo de datos de su búfer se fija una matriz simple es todo lo que necesita:

     int buffer[5];

    Añadir a que un par de punteros:

     int* start = &buffer[0];
     int* end   = &buffer[4]+1;
     int* input = start;
     int* output = start;
  4. 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);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here