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 = 64bytes

    Mö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) % cs sollte eine (private) (inline) Methode next_index sein, 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.


Anmelden zum Antworten