Ring-Puffer Indexierung

Gast #390816
Lesenswert?

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 #390818
Lesenswert?

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 #390821
Lesenswert?

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 #390822
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren