Wie lege ich in C++ einen Ringbuffer an?
Er soll später ca. 1000 Einträge fassen. Die Einträge sind jeweils ByteArrays.
Beispielarray: BYTE arr1 = { 0xfe, 0x34, 0x00 .... };
Wie realisiere ich das schnell und ( für mich ) verständlich?
Wie lege ich in C++ einen Ringbuffer an?
Er soll später ca. 1000 Einträge fassen. Die Einträge sind jeweils ByteArrays.
Beispielarray: BYTE arr1 = { 0xfe, 0x34, 0x00 .... };
Wie realisiere ich das schnell und ( für mich ) verständlich?
haben die ByteArrays ne feste Größe oder ist die variabel?
wenn variabel, dann wenigstens ne maximale größe?
Oh vergessen
Die ByteArrays haben immer 10 Einträge.
Der Ringbuffer soll halt ein Array sein wo ich 1000 Daten rein schreibe und die 1001 ist dann wieder nummer 0. also dass dann die alten daten wieder überschrieben werden.
Leider steh ich da voll auf dem Schlauch. In meinem Kopf ist die Lösung schon da, ich bekomm sie nur nicht in C++ übersetzt
auf die Schnelle müsste es so erstmal gehen
die Klasse kann man noch komfortabler machen mit nem dynamischen Array, so dass die Größe eingestellt werden kann
man könnte auch noch einen Zähler für den Pufferinhalt einsetzen, damit kann man dann verhindern dass der Lesezeiger den Schreibzeiger überholt und man hat auch gleich ein Maß für den Füllstand des Puffers
ganz sicher sind die Read und Write Methoden nicht, wenn die übergeben Pointer auf Arrays <10 zeigen kommt es zu bösen Fehlern
den wrap around bei 1000 müsste man auch noch mal testen, dafür kann man das Array ja auch mal kleiner machen
#include <stdio.h>
#define BYTE unsigned char
class CRingBuffer
{
public:
CRingBuffer();
~CRingBuffer();
Read(BYTE* Dest);
Write(BYTE* Source);
private:
BYTE Buffer[1000][10];
int nRead;
int nWrite;
};
CRingBuffer::CRingBuffer()
{
nRead=0;nWrite=0;
}
CRingBuffer::~CRingBuffer()
{
}
CRingBuffer::Write(BYTE* Source)
{
//kopieren
for(int i=0;i<10;i++)Buffer[nWrite][i]=Source[i];
//Zaehler weiter
if(nWrite<999)nWrite++;
else nWrite=0;
}
CRingBuffer::Read(BYTE* Dest)
{
//kopieren
for(int i=0;i<10;i++)Dest[i]=Buffer[nRead][i];
//Zaehler weiter
if(nWrite<999)nRead++;
else nRead=0;
}
//##############################
int main(int argc, char* argv[])
{
BYTE Test1[]={0x00, 0x01, 0x02 ,0x03, 0x04, 0x05 ,0x06, 0x07, 0x08 ,0x0a};
BYTE Test2[]={0x10, 0x11, 0x12 ,0x13, 0x14, 0x15 ,0x16, 0x17, 0x18 ,0x1a};
BYTE Test3[]={0x20, 0x21, 0x22 ,0x23, 0x24, 0x25 ,0x26, 0x27, 0x28 ,0x2a};
BYTE Dummy[10];
CRingBuffer TestBuf;
TestBuf.Write(Test1);
TestBuf.Write(Test2);
TestBuf.Write(Test3);
for(int i=0;i<3;i++)
{
TestBuf.Read(Dummy);
for(int n=0;n<10;n++)
{
printf("0x%0.2x ",Dummy[n]);
}
printf("\n");
}
return 0;
}
Alles anzeigen
ich hoffe das hilft dir erstmal
Gruß
Jamo
Danke schön! Hast mir sehr geholfen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!