Wie codiere ich einen einfachen ganzzahligen Ringpuffer in C/C++?

Lesezeit: 2 Minuten

Ich sehe viele Vorlagen und komplizierte Datenstrukturen für die Implementierung eines Ringpuffers.

Wie codiere ich einen einfachen ganzzahligen Ringpuffer für 5 Zahlen?

Ich denke, in C ist das einfachste?

Vielen Dank.

  • Die Komplexität des Codes hängt davon ab, wie sicher und robust er sein soll. Möchten Sie beispielsweise einen Unterlauf/Überlauf verhindern?

    – Oliver Charlesworth

    1. September 2010 um 20:38 Uhr

  • Hinweis: Ein kreisförmiger (Ring-)Puffer unterscheidet sich von einem kreisförmigen Warteschlange.

    – Thomas Matthäus

    1. September 2010 um 20:42 Uhr

  • Ich muss nur die 5 letzten Werte einiger Daten speichern, was auch immer ein besseres Design dafür hat.

    – TTT

    1. September 2010 um 20:43 Uhr


  • @TTT Müssen Sie sie in einer speziellen Reihenfolge abrufen (FIFO, LIFO, keine Bestellung)?

    – fjardon

    3. April 2015 um 15:11 Uhr

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

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

  • Ausgehend von der persönlichen Erfahrungsdatei 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.

    – foto_tom

    2. September 2010 um 2:40 Uhr


  • Warum setzen Sie ind nicht einfach auf uint? Das würde Ihr Problem effizienter lösen, wenn es nur um Ergänzungen geht

    – Triskeldeian

    9. April 2016 um 9:13 Uhr

Nehmen Sie ein Array, arrein Index idxund ein Zähler, num.

Einführen foosagen arr[idx++] = foo; idx %= buffer_len; num++;.

Zum Auslesen eines Elements in foosagen foo = arr[(idx-num)%buffer_len]; num--;.

Grenzüberprüfungen hinzufügen.

  • Sie brauchen num und idx nicht.

    – Benutzer3467349

    12. März 2015 um 22:48 Uhr

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

 int buffer[5];

Dazu noch ein paar Hinweise:

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

Benutzer-Avatar
Raj K

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

1178880cookie-checkWie codiere ich einen einfachen ganzzahligen Ringpuffer in C/C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy