mikrocontroller.net

Forum: Compiler & IDEs Warum bringt GCC in diesm Fall keine Fehlermeldung?


Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Neulich hatten wir im Code folgenden Tippfehler:
uint32 test(uint8* aData)
{
  *aData = 0,     // <--- Komma, anstatt Semikolon!

  *aData++ = HWREG(I2C1_MASTER_BASE + I2C_O_MDR);

  return 0;
}

Der gcc compiler (3.4.5) akzeptiert den Code ohne Warnung und Fehler, 
trotz -Wall und -WExtra. Was passiert den hier überhaupt?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt auch keinen Grund zum meckern. Siehe C Handbuch, unter 
Komma-Operator. Es passiert das gleiche.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Höchstwahrscheinlich dasselbe wie mit Semikolon. Nur bei der Wirkung des 
++ bin ich mir nicht ganz sicher, ob der C-Standard bei einem Komma 
nicht auch "das falsche" zulässt.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw. in diesem speziellen Fall ändert sich auch nichts, wenn man die 
erste Zeile (die mit dem Komma am Ende) komplett weglässt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der mechatroniker schrieb:

> Höchstwahrscheinlich dasselbe wie mit Semikolon. Nur bei der Wirkung des
> ++ bin ich mir nicht ganz sicher, ob der C-Standard bei einem Komma
> nicht auch "das falsche" zulässt.

Das Komma ist ein sequence point. Ausserdem kann man einigermassen 
sicher sein, dass GCC sonst darauf hingewiesen hätte.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das Komma ist ein sequence point.

Gut zu wissen, wieder was gelernt.

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau,

Danke!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil das gueltige Syntax ist. Und nein, das ist nicht das selbe wie ein 
Semikolon (wie schon richtig gesagt wurde eine Sequenz), siehe hier:

http://www.eskimo.com/~scs/cclass/int/sx4db.html

Das Verhalten ist ggf. anders als man erwarten wuerde, vor allem wenn 
der Ausdruck evaluiert wird.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was man so alles falsch machen kann :-o
Dazu auch der Beitrag "Re: for Schleife (C)"


 *aData++ = HWREG(I2C1_MASTER_BASE + I2C_O_MDR);
Schon das könnte einige ins Schleudern bringen ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:

> Schon das könnte einige ins Schleudern bringen ;-)

Ich wollte jetzt schreiben: Aber nur, wenn sie den K&R nicht gelesen
haben, denn Dereferenzieren eines Zeigers mit anschließendem
automatischen Inkrementieren wird schon da ausgiebig genutzt.  (Das
hatte seinerzeit auch richtig Sinn: die PDP11 konnte zwei
Adressierungsarten, die genau so gearbeitet haben.  Damit wurde dort
u. a. der Stack implementiert, aber da in der PDP11 alles sehr
orthogonal war, konnte man diese Adressierung für alle Register
anwenden.  Die entsprechenden C-Darstellungen für *ptr++ und *--ptr
konnten daher 1:1 in die Hardware abgebildet werden.)

Aber: nachdem ich mir das da oben nochmal angeguckt habe, ist mir
schlagartig klar geworden, dass nicht nur der Ausdruck vor dem
Komma, sondern auch das ++ beim OP wirkungslos sind.  Damit das
einen Sinn hat, müsste man die Adresse des Zeigers übergeben.
uint32 test(uint8 **aData)
{
  *((*aData)++) = HWREG(I2C1_MASTER_BASE + I2C_O_MDR);

  return 0;
}

Aufruf dann mit test(&ptr);.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber: nachdem ich mir das da oben nochmal angeguckt habe, ist mir
> schlagartig klar geworden, dass nicht nur der Ausdruck vor dem
> Komma, sondern auch das ++ beim OP wirkungslos sind.
Mein Glückwunsch, das wars, was ich meinte  ;-)

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ging mir nur um die beiden Zeilen. Im "richtigen" Code folgen noch 
ein paar Dutzend weitere Zeilen, welche das Einlesen einiger Bytes 
mittels Loop erledigen. Daher denke ich, dass das schon korrekt ist.

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.