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
Moin, ist nur ne Vermutung also nicht festnageln. versuch mal: rxbufp = (++rxbufp)&rvmask; Nicht dass dein Compiler mit dem Pre- und Postincrement durcheinander kommt...
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.
Ich könnte mir allerdings vorstellen, dass durch die Klammerung das Inkrement vorgezogen wird, also wie ein Preincrement behandelt wird
Nö, die Klammerung beschreibt nur einen Token, der vorher auch schon nur ein Token war. Der Rückgabewert ist rxbuffp (vor inkrementierung).
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")
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.