Lösung der Aufgabe: Ringbuffer (siehe Seite 202 (3. Aufl.))

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.

C-Code der Lösung:

/* 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>
#include <ctype.h>

void 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;

}