www.mikrocontroller.net

Forum: Compiler & IDEs fremde C Syntax


Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal


In einer Headerdatei steht folgendes:

#define calc(Reg3, Reg2, Reg1 ) \
  ( 0x00000000L +   \
  ( Reg3 <<  2) + \
  ( Reg2  <<  1) + \
  ( Reg1  ))


Was bedeuten die Schrägstriche am Ende immer?
Und was macht die Funktion insgesamt? Ich komm da nicht ganz mit.

Danke!

Autor: Snake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die backslashe zeigen dem compiler, dass der befehl in der nächsten 
zeile weiter geht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jakob wrote:

> Und was macht die Funktion insgesamt? Ich komm da nicht ganz mit.

Es ist keine Funktion, sondern ein Makro.  Dessen Inhalt wird beim
Auftreten ersetzt.  Wenn also einer irgendwo im Text
x = calc(42, 23, 11);
schreibt, dann ersetzt der Präprozessor das durch
x =   ( 0x00000000L +     ( 42 <<  2) +   ( 23  <<  1) +   ( 11  ));
Wobei das "0x00000000L + " natürlich nur eine sehr umständliche
Schreibweise für "hier passiert gar nichts weiter" ist. ;-)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat das 0L nicht vielleicht den Sinn dass die Berechnung in long 
ausgeführt wird??

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, OK, aber dann hätte es ein typecast auch (und vor allem
offensichtlicher) getan.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter wrote:
> hat das 0L nicht vielleicht den Sinn dass die Berechnung in long
> ausgeführt wird??

Das war vielleicht die Intention, aber dazu ist es an der völlig 
falschen Stelle.

Es müssen ja zuerst die Klammerausdrücke berechnet werden und wenn bei 
(Reg3<<2) schon 2 Bits runtergefallen sind, kannse die 32-Bit-Addition 
auch nicht wieder hervorzaubern.


Peter

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es müssen ja zuerst die Klammerausdrücke berechnet werden und wenn bei
>(Reg3<<2) schon 2 Bits runtergefallen sind, kannse die 32-Bit-Addition
> auch nicht wieder hervorzaubern.

bei entsprechenden Zahlen fällt beim Schieben noch nichts runter, 
sondern erst bei der Addition.
Aber der Ausdruck ist sicher nicht besonders guter Programmierstil.

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.