2010-09-01 103 views
16

Ich sehe viele Vorlagen und komplizierte Datenstrukturen für die Implementierung eines Ringpuffers.Wie programmiere ich einen einfachen Ringspeicher in C/C++?

Wie kann ich einen einfachen Integer-Ringpuffer für 5 Zahlen codieren?

Ich denke in C ist die einfachste?

Danke.

+7

Die Komplexität des Codes hängt davon ab, wie sicher und robust Sie es haben möchten. Möchten Sie beispielsweise Unterlauf/Überlauf verhindern? –

+3

Hinweis: Ein ringförmiger Puffer unterscheidet sich von einer kreisförmigen * Warteschlange *. –

+0

Ich muss nur die 5 letzten Werte einiger Daten speichern, also was auch immer ein besseres Design hat, um das zu tun. –

Antwort

25

Haben Sie ein Array, buffer, von 5 ganzen Zahlen. Haben Sie einen Index ind zum nächsten Element. Wenn Sie hinzufügen, tun

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

Aus der persönlichen Erfahrung Datei müssen Sie darauf achten, dass Ind nicht negativ ist. Wenn Sie die zweite Zeile in "ind = (max (0, ind)% 1) + 5;" ändern, müssen Sie sich keine Gedanken über negative Werte für ind machen. –

+2

Warum stellst du dich nicht einfach auf uint ein? Das würde Ihr Problem effizienter lösen, wenn nur Zusätze beteiligt sind. – Triskeldeian

1

Wenn die Größe und Datentyp Ihrer Puffer festgelegt sind, ist ein einfaches Array alles, was Sie brauchen:

int buffer[5]; 

hinzufügen, dass ein paar Hinweise:

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

Nehmen Sie ein Array, arr, einen Index idx, und einen Zähler, num.

foo einzufügen, sagen arr[idx++] = foo; idx %= buffer_len; num++;.

Um einen Artikel in foo auszulesen, sagen Sie foo = arr[(idx-num)%buffer_len]; num--;.

Hinzufügen von Grenzkontrollen.

+0

Sie brauchen num und idx nicht. – 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); 
} 
Verwandte Themen