Ring-Puffer Indexierung

Gast #390816
Guten Tag,
könnte mir jemand einen Tip geben, warum zwischen den folgenden beiden
Code-Versionen für eine Ring-Puffer-Implementierung (dsPic30F6014, C30)
ein Unterschied sein könnte:

//defines und deklarierte Variablen
..
#define rvmask 15
unsigned int rxbuf[rvmask+1];
unsigned char rxbufp=0;
unsigend int rxr;
..

//Code-Version 1:
..
rxbufp = (rxbufp++)&rvmask;
rxr = rxbuf[rxbufp];
..

//Code-Version 2:
..
rxbufp++;
rxbufp = rxbufp&rvmask;
rxr = rxbuf[rxbufp];
..

Die zweite Code-Version funktioniert einwandfrei, während bei der
ersten die Maskierung von rxbufp überhaupt nicht funktioniert und der
Ring-Puffer-Indexierung fehlschlägt. rxbufp wird nicht wieder auf Null
gebracht beim überschreiten von rvmask (erst beim char-overflow von
255->0 wird der Wert automatisch wieder Null).

Wieso das? Hat jemand eine Idee. Vielen Dank.
S. Leven
Gast
Moin,

ist nur ne Vermutung also nicht festnageln.
versuch mal: rxbufp = (++rxbufp)&rvmask;
Nicht dass dein Compiler mit dem Pre- und Postincrement durcheinander
kommt...
Gast
Wieso durcheinander kommt?
Es wäre doch schlimm, wenn bei beiden das gleiche passiert. Dann wäre
der Compiler durcheinander!
Das ist doch ein Postinkrement. Also ist es vollkommen klar, dass bei
beiden Codeschnippseln nicht das gleiche raus kommt.
Gast
In den Codeschnipseln werden tatächlich zwei verschiedene Dinge
durchgeführt. In

rxbufp = (rxbufp++)&rvmask;

ist ein Postincrement von rxbufp vorgesehen. D.h. rxbufp wird erst nach
der Verwendung seines Wertes (für ... & rvmask)erhöht.

rxbufp++;
rxbufp = rxbufp&rvmask;

Aber entspricht eher einem Preincrement von rxbufp, also

rxbufp = (++rxbufp)&rvmask;

Prinzipiell wäre ich aber wegen der undefinierten
Abarbeitungsreihenfolge in C mit solchen Konstrukten (zuweisung einer
incrementierten Variablen an sich selbs) vorsichtig.
(siehe: http://de.wikibooks.org/wiki/C-Programmierung:_Operatoren unter
"Rangfolge und Assoziativität")
Gast
Naja, es ist eigentlich ganz einfach: Konstruktionen wie

          variable = variable++;
und
          variable = ++variable;

sind laut C-Standard schlichtweg undefiniert.

D.h. der Compiler darf dabei den größten Mist machen, wie er will. Das
Spektrum reicht von ignorieren über warnen bis zum fehlerhaften Code
erzeugen.
Gast
Achso, was Du eigentlich willst, ist:

  index = (index+1) & maske;

oder:

  index++;
  index &= maske;

oder, viel flexibler:

  index = index < maximum ? index+1 : 0;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.