Buffer der Länge 10 erstellen in C

Velow

Mitglied
Hallo Leute,
ich möchte in C einen Buffer definieren.

Dabei lese ich aufsteigende Zahlen in den Buffer, der eine Länge von 10 Werten haben soll.

Ist der buffer voll (also es wurden 10 Zahlen eingelesen), so soll per Programmaufruf der kleinste Wert (also der, der ganz links steht) entfernt werden, und der buffer nach rechts um einen wert erweitert werden, damit man wieder auf die buffergröße 10 kommt.

Hier mal als kleine "Skitze"

1. Lese Zahlen ein:

Leerer Buffer:
[ ]|[ ]|[ ]|[ ]|[ ]|[ ]|[ ]|[ ]|[ ]|[ ]

Fülle mit zahlen aufsteigend:
[1]|[2]|[3]|[4]|[5]|[6]|[7]|[8]|[9]|[10]

2. Um "11" einzulesen, lösche "1" und füge "11" hinten an:

Ausgangssituartion:
[1]|[2]|[3]|[4]|[5]|[6]|[7]|[8]|[9]|[10]

Lösche "1":
[2]|[3]|[4]|[5]|[6]|[7]|[8]|[9]|[10]|[ ]

Füge "11" ein:
[2]|[3]|[4]|[5]|[6]|[7]|[8]|[9]|[10]|[11]


Wie könnte man sowas realisieren ?

Ich habe das mit einem Array versucht aber das hat nicht funktioniert.
Ich denke das müsste man mittels Zeiger auf dem Speicher realisieren aber ich bekomme da nichts schönes hin.

Kann mir jemand sagen wie ich so einen "Bereich" definiere mit meinen Funktionen "entferne vorne" und "füge hinten" wieder an ? Oder nur einen Hinweis wie man einen "dynamischen" Buffer der Länge 10 definiert.

Danke schonmal
 
Hi.

Ein einfacher Ringpuffer:
C:
#include <stdio.h>

typedef struct ringbuffer {
    int idx;
    int fill;
    int buffer[10];
} ringbuffer;



void add(int x, ringbuffer* rb) {
    rb->buffer[rb->idx++] = x;

    if (rb->idx == 10) rb->idx = 0;

    if (rb->fill < 10) ++(rb->fill);
}

void print(const ringbuffer* rb) {
    for (int i = 0; i <= rb->fill; ++i) {
        printf("%d, ", rb->buffer[(rb->idx + i) % 10]);
    }
    puts("");
}

int main(int argc, char *argv[])
{
    ringbuffer rb = { 0, 0 };

    puts("empty:");
    print(&rb);

    for (int i = 1; i < 5; ++i)
        add(i, &rb);

    puts("+5");
    print(&rb);

    for (int i = 5; i < 10; ++i)
        add(i, &rb);

    puts("+5");
    print(&rb);

    for (int i = 10; i < 15; ++i)
        add(i, &rb);

    puts("+5");
    print(&rb);

    return 0;
}
Gruß
 
Es geht auch weitaus kürzer, wobei die Werte hier auch wirklich verschoben werden und nicht nur die Leseaktion:
C:
void add(int *rp,int wert)
{
  if(*rp==10)
    memmove(rp+1,rp+2,9*sizeof*rp),rp[10]=wert;
  else
    rp[++*rp]=wert;
}

int main()
{
  int i,j,array[10+1]={0};

  for(j=0;j<99;++j)
  {
    add(array,j);
    for(i=1;i<=10;++i) printf("%2d ",array[i]);
    puts("");
  }

  return 0;
}
 
Zurück