2010-09-01 12 views
16

Veo muchas plantillas y estructuras de datos complicadas para implementar un búfer circular.¿Cómo codigo un búfer circular entero simple en C/C++?

¿Cómo se codifica un búfer circular entero simple para 5 números?

Estoy pensando en C es el más sencillo?

Gracias.

+7

La complejidad del código sube con la forma segura y robusta que quiere que sea. ¿Desea evitar el underflow/overflow, por ejemplo? –

+3

Nota: un búfer circular (en anillo) es diferente de una cola * circular. –

+0

Solo necesito almacenar los 5 últimos valores de algunos datos, por lo que cualquiera que tenga un diseño mejor para hacerlo. –

Respuesta

25

Tienen una matriz, buffer, de 5 enteros. Tener un índice ind para el siguiente elemento. Al agregar, hacer

buffer[ind] = value; 
ind = (ind + 1) % 5; 
+6

Desde el archivo de experiencia personal, debe tener cuidado de que ind no sea negativo. Si cambia la segunda línea a "ind = (max (0, ind)% 1) + 5;", no tiene que preocuparse por los valores negativos para ind. –

+2

¿Por qué no solo pones ind para ser inocente? Eso resolvería su problema de manera más eficiente si solo incluye adiciones – Triskeldeian

1

Si el tamaño y tipo de datos de la memoria intermedia son fijos, una matriz simple es todo lo que necesita:

int buffer[5]; 

A esto se añade un par de punteros:

int* start = &buffer[0]; 
int* end = &buffer[4]+1; 
int* input = start; 
int* output = start; 
11

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

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

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

Agregar controles de límites.

+0

No necesita num e idx. – user3467349

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); 
} 
Cuestiones relacionadas