Forum: Digitale Signalverarbeitung / DSP / Machine Learning Ring-Puffer Indexierung


von S. Leven (Gast)


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

von programinator (Gast)


Lesenswert?

Moin,

ist nur ne Vermutung also nicht festnageln.
versuch mal: rxbufp = (++rxbufp)&rvmask;
Nicht dass dein Compiler mit dem Pre- und Postincrement durcheinander
kommt...

von guelcki (Gast)


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.

von programinator (Gast)


Lesenswert?

Ich könnte mir allerdings vorstellen, dass durch die Klammerung das
Inkrement vorgezogen wird, also wie ein Preincrement behandelt wird

von guelcki (Gast)


Lesenswert?

Nö, die Klammerung beschreibt nur einen Token, der vorher auch schon nur
 ein Token war. Der Rückgabewert ist rxbuffp (vor inkrementierung).

von Kleiner (Gast)


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")

von Unbekannter (Gast)


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.

von Unbekannter (Gast)


Lesenswert?

Achso, was Du eigentlich willst, ist:

  index = (index+1) & maske;

oder:

  index++;
  index &= maske;

oder, viel flexibler:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.