mikrocontroller.net

Forum: Compiler & IDEs post-increment, nach jedem einzelnem Array-Zugriffe


Autor: Oliver Rendgen (rendgeor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
folgendes Snippet zeigt, dass x2 nach der Ausführung den Wert 0x1111 
besitzt, da index erst nach Ausführung der kompletten Zeile erhöht wird.
Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu 
erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei 
Arrayelemente zugreifen kann, ohnen index fest zu setzen?


uint16_t x2 = 0x7766;
uint8_t ii[2] = {0x11, 0x22};

index = 0x00;
x2 = (((ii[index++]) << 8)|(ii[index++]));

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Rendgen schrieb:
> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
> Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Nein, da der C Standard nicht festlegt, welcher der beiden Oder-Terme 
zuerst errechnet wird.

Außerdem wirds zeitlich nicht kürzer, wenn das gehen würde, daher die 
Gegenfrage, wofür das gut sein sollte (außer eine Zeile Code zu sparen)?
:-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Oliver Rendgen (rendgeor)

>erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
>Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Obfuscated C Kontest?

x2 = (((ii[index++]) << 8)|(ii[index++]));

Genialität besteht darin, komplexe Dinge einfach auszudrücken.

x2 = (((ii[index]) << 8)|(ii[index])); i++;
x2 = ii[index])*257; i++;

MFG
Falk

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
>> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
>> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
>> Arrayelemente zugreifen kann, ohnen index fest zu setzen?
>
> Nein, da der C Standard nicht festlegt, welcher der beiden Oder-Terme
> zuerst errechnet wird.

Nicht nur das. Hier wird index zweimal beschrieben, ohne daß dazwischen 
ein Sequenzpunkt liegt. Dabei darf beliebiges rauskommen, da das 
Verhalten (nicht nur die Ausführungsreihenfolge) dieser Codezeile 
komplett undefiniert ist.

> Außerdem wirds zeitlich nicht kürzer, wenn das gehen würde, daher die
> Gegenfrage, wofür das gut sein sollte (außer eine Zeile Code zu sparen)?

Oliver Rendgen schrieb:
> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
> Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Warum das unbedingt in einer Codezeile sein muß, ist mir zwar nicht 
klar, aber bitte:
x2 = ii[index++] << 8; x2 |= ii[index++];

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.