Kleines Ringpuffer problem
-
Hallo zusammen,
und zwar hab ich mir einen kleinen Ringpuffer geschrieben, der aber in einen Sonderfall nicht mehr schreiben mag. Hier mal der Sourceausschnitt dazu:
bool CircularBuffer::WriteByte(char c) { if(cb != NULL) { if(rp == (wp + 1) % cs) return false; else { memcpy((char*)cb + wp, &c, 1); wp = (wp + 1) % cs; return true; } } return false; }rp = readpointer = 0;
wp = writepointer = 0;
cs = puffergröße = 64bytesMöchte ich nun in diesen Puffer 64 bytes reinschreiben geht das nicht, da der Modulo anspringt, obwohl ja genug platz wäre. Der zweite fall ist zB: rp = 0; wp = 63; cs = 64; -> geht auch nicht (oder die restgrößen berechnung ist falsch bei mir)
unsigned int CircularBuffer::GetReadSize() { if(rp == wp) return 0; if(rp < wp) return (wp - rp); if(rp > wp) return (cs - rp) + wp; return 0; } unsigned int CircularBuffer::GetWriteSize() { if(wp == rp) return cs; if(wp < rp) return (rp - wp); if(wp > rp) return (cs - wp) + rp; return 0; }Hat da jemand Ideen?
-
merk dir in einer zusätzlichen variable, wieviele bytes im buffer sind, das ist einfacher...

-
(wp + 1) % cssollte eine (private) (inline) Methodenext_indexsein, meinst du nicht?Bezeichner dürfen außerdem auch länger als 2 Zeichen sein.
// sieht huebscher aus: std::size_t CircularBuffer::GetReadSize() { return (rp == wp) ? 0 : (rp < wp) ? (wp - rp) : (cs - rp) + wp; }Zu deinem Problem: du brauchst entweder ein Dummy-Element oder musst dir die Restgröße merken - wie willst du sonst zwischen voll und leer unterscheiden?
-
finix schrieb:
// sieht huebscher aus:

-
pale dog schrieb:


-
finix schrieb:
Bezeichner dürfen außerdem auch länger als 2 Zeichen sein.
// sieht huebscher aus: std::size_t CircularBuffer::GetReadSize() { return (rp == wp) ? 0 : (rp < wp) ? (wp - rp) : (cs - rp) + wp; }Ansichtssache.
, aber ich glaube du hast recht das ich noch ein Dummy brauch. Danke erst mal für die Hilfe.