Warum bringt GCC in diesm Fall keine Fehlermeldung?

Gast #1387388
Hallo

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

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

7
  return 0;
8
}

Der gcc compiler (3.4.5) akzeptiert den Code ohne Warnung und Fehler, 
trotz -Wall und -WExtra. Was passiert den hier überhaupt?
Gast #1387396
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.
#1387402
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.
Moderator Persönliche Seite #1387650
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.
1
uint32 test(uint8 **aData)
2
{
3
  *((*aData)++) = HWREG(I2C1_MASTER_BASE + I2C_O_MDR);
4

5
  return 0;
6
}

Aufruf dann mit test(&ptr);.
Gast #1388723
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.