2010-09-01 24 views
16

Je vois beaucoup de modèles et de structures de données compliquées pour implémenter un tampon circulaire.Comment coder un tampon circulaire simple en C/C++?

Comment je code simple entier tampon circulaire pour 5 numéros?

Je pense en C est le plus simple?

Merci.

+7

La complexité du code augmente avec la sécurité et la robustesse que vous souhaitez. Voulez-vous que cela prévienne les débordements/débordements, par exemple? –

+3

Remarque: un tampon circulaire (anneau) est différent d'une file d'attente * circulaire *. –

+0

J'ai juste besoin de stocker les 5 dernières valeurs de certaines données, donc tout ce qui a une meilleure conception pour le faire. –

Répondre

25

Vous avez déjà un tableau, buffer, de 5 entiers. Avoir un index ind à l'élément suivant. Lorsque vous ajoutez, faites

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

Dans le fichier d'expérience personnelle, vous devez faire attention à ce que ind ne soit pas négatif. Si vous changez la deuxième ligne à "ind = (max (0, ind)% 1) + 5;", vous n'avez pas à vous soucier des valeurs négatives pour ind. –

+2

Pourquoi ne pas simplement mettre ind à être uint? Cela résoudrait votre problème plus efficacement si seulement des ajouts sont impliqués – Triskeldeian

1

Si la taille et le type de votre mémoire tampon des données sont fixes, un simple tableau est tout ce dont vous avez besoin:

int buffer[5]; 

Ajoutez à cela des pointeurs de couple:

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

Prenez un tableau, arr, un indice idx, et un compteur, num.

Pour insérer foo, dire arr[idx++] = foo; idx %= buffer_len; num++;. Pour lire un élément dans foo, par exemple foo = arr[(idx-num)%buffer_len]; num--;.

Ajouter des vérifications aux limites.

+0

Vous n'avez pas besoin de num et 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); 
}