Das Bild zeigt einen aktuellen Zustand des Ringbuffers. 3 Zahlen sind derzeit im Buffer. Die Zellen 2,3,4 sind mit diesen Zahlen belegt. Der nächste freie Platz für eine neu eintreffende Zahl ist in der Zelle 5. Das nächste Element das ausgelesen wird, ist in Zelle 2.
/* ringbuffer.c die Verwendung von n, um sich zu merken, wieviele Zahlen momentan im Buffer sind, vereinfacht die Loesung stark */ #include <stdio.h> #define NMAX 8 int iput = 0; /* Position fuer naechstes abzulegende Zeichen */ int iget = 0; /* Position fuer naechstes zu lesendes Zeichen */ int n = 0; /* Anzahl der Zeichen im Buffer */ double buffer[NMAX]; /* addring schreitet im Ring um eins weiter und sorgt dafuer dass (NMAX - 1) + 1 nicht NMAX sondern wieder 0 ist */ int addring(int i) { return (i+1) == NMAX ? 0 : i+1; } double get(void) { int pos; if (n > 0) { pos = iget; iget = addring(iget); n--; return buffer[pos]; } else { printf("Buffer ist leer\n"); return 0.0; } } void put(double z) { if (n < NMAX) { buffer[iput] = z; iput = addring(iput); n++; } else printf("Stack ist voll\n"); } /* ringbuffertest.c */ #include <stdio.h> #includevoid put(double z); double get(void); int main(void) { char wastun[5]; double z; do { printf("Was tun ? "); scanf("%s", &wastun); switch (tolower(wastun[0])) { case 'p': /* put */ printf("Zahl ? "); scanf("%lf", &z); put(z); break; case 'g': /* get */ z = get(); printf("%8.2f vom Buffer geholt\n", z); break; case 'e': printf("Ende\n"); break; default: printf("%s - ungueltiger Befehl!\n", wastun); } /* end switch */ } while (wastun[0] != 'e'); return 0; }