2010-09-01 17 views
16

Vedo molti modelli e strutture dati complicate per l'implementazione di un buffer circolare.Come faccio a codificare un semplice buffer circolare intero in C/C++?

Come si codifica un buffer circolare intero semplice per 5 numeri?

Sto pensando in C è il più semplice?

Grazie.

+7

La complessità del codice aumenta quanto sicuro e robusto vuoi che sia. Vuoi impedire l'underflow/overflow, ad esempio? –

+3

Nota: un buffer circolare (ad anello) è diverso da una coda * circolare *. –

+0

Ho solo bisogno di memorizzare gli ultimi 5 valori di alcuni dati, quindi qualsiasi cosa ha un design migliore per farlo. –

risposta

25

Dispone di un array, buffer, di 5 numeri interi. Avere un indice ind all'elemento successivo. Quando si aggiunge, fare

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

Dal file dell'esperienza personale, è necessario fare attenzione che ind non sia negativo. Se cambi la seconda linea in "ind = (max (0, ind)% 1) + 5;", non devi preoccuparti dei valori negativi per ind. –

+2

Perché non hai appena impostato ind per essere uint? Ciò risolverebbe il tuo problema in modo più efficiente se fossero coinvolte solo le aggiunte – Triskeldeian

1

Se la dimensione e il tipo di dati buffer sono fissi, una matrice semplice è tutto ciò che serve:

int buffer[5]; 

A questo si aggiunge un paio di puntatori:

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

Prendere un array, arr, un indice idx e un contatore, num.

Per inserire foo, ad esempio arr[idx++] = foo; idx %= buffer_len; num++;.

Per leggere un articolo in foo, ad esempio foo = arr[(idx-num)%buffer_len]; num--;.

Aggiungere controlli di contorno.

+0

Non hai bisogno di 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); 
}