Ich hab auf den Abend auch keine Lust mehr mich durch Code kämpfen zu müssen. Aber einen alternativen Lösungsansatz hätte ich vielleicht, sowas könnte ich demnächst vielleicht auch gebrauchen. Also:
Code:
//globaler Zugriff:
*TBuffercell FirstBuffercell;
*TBuffercell LastBuffercell;
typedef struct{
char[128] buffer; //Kleines Array, das deine Daten aufnimmt, kann natürlich auch eine andere Größe haben, die Größe sollte aber als Konstante hinterlegt werden
int queueStart; //Gibt den Anfang des beschriebenen Bereichs an, bei "vollem" buffer also 0, so findest du den Anfang wieder wenn du das Array nicht auf einen Schlag auslesen willst
int queueEnd; //Gibt das Ende des beschriebenen Bereichs an, bei "vollem" buffer also 127, so findest du das Ende wieder wenn du das Array nicht auf einen Schlag beschreiben willst
*nextTBuffercell; //Pointer auf das nächste Speicherelement, bei Null ist das vordere Ende der Queue erreicht
}TBuffercell
Das wars dann auch fast schon, noch eine Funktion die deine Daten auf lauter TBuffercells quer durch den Speicher verteilt () und eine, die mit dem Pointer FirstBuffercell hinterherkriecht und die Daten wieder zurückgibt, aber das kriegst du selber hin. Nicht vergessen, LastBuffercell und queueEnd bzw. FirstBuffercell und queueStart zu inkrementieren.
Jetzt war ich doch mal neugierig und hab mir mal deinen Code nochmal angesehen, viel Arbeit ist so ein Ringpuffer nun doch nicht. Warum der nicht funktioniert kann ich dir auf die Rasche nicht sagen, allerdings belegt der den Speicher in einem einzigen Stück, ist fest begrenzt und belegt den Platz auch wenn du ihn nicht brauchst.
Das Konzept mit der struct-Kette ist da weitaus flexibler, kann gerne fragmentieren, kann ausgedehnt werden solange noch Speicher da ist (du kannst ja ohne weiteres ein neues struct erstellen und dem jetzt struct das nun an zweiter Stelle steht den Pointer umsetzen), eine Größenbeschränkung kannst du auch einbauen (vom ersten struct bis zum letzten durchzählen). Dafür hast du etwas mehr Überbau an Speicherbedarf für die Pointer.
Edit:
Zumindest denk ich mir das so einfach, seit ich mich mal etwas ernsthaft mit OOP befaßt habe fällt mir prozedurale Programmierung echt schwer und C geht mir sehr auf die Nerven...ich bin auf die Probleme gespannt die dieses Konzept aufwirft.
Lesezeichen