Fehlermeldung: expected identifier before numeric constant

OP #6095757
Lesenswert?

Hallo und guten Tag,

habe in einer Headerdatei folgende Definitionen:

#define TASTENDRUCK_KEINER     0
#define TASTENDRUCK_GEDRUECKT  1
#define TASTENDRUCK_WIEDERHOLT 2
#define TASTENPHASE_NORMAL     0
#define TASTENPHASE_ENTPRELLEN 1
#define TASTENPHASE_WIEDERHOLT 2

Der Compiler (Atmel Studio 7.0) meldet für die Zeilen in denen die 0 
(Null)
zugewiesen wir den Fehler: expeted identifier befor numeric constant
Was ist bei 0 anders gegenüber der 1 und 2.

Gruß Heinz
Gast #6095783
Lesenswert?

> Der Compiler (Atmel Studio 7.0) meldet für die Zeilen in denen die 0
> (Null) zugewiesen wir den Fehler [..]

Hier wird keine 0 zugewiesen.

> Was ist bei 0 anders gegenüber der 1 und 2.

Dass Du uns nicht den kompletten Quellcode zeigst.
Gast #6095949
Lesenswert?

Wenn der Compiler bei den oben geposteten 6 Zeilen diesen Fehler
expeted identifier befor numeric constant
ausgibt, dann ist der Rechner verseucht.
Wahrscheinlich hast du dir C-Emotet eingefangen. Als Lösung hilft nur 
eine vollständige Formatierung des Rechners. Nicht lange warten, bevor 
er noch andere Rechner mit zerstört.
OP #6096053
Lesenswert?

Hallo Micha,
zum Glück habe ich nicht alle Hinweise berücksichtigt und meinen Rechner 
sofort formartiert bzw. verschrottet. Ich habe eine lange Lebens- und 
Berufserfahrung (ich bin Jahrgang 1943)und während dieser Zeit immer 
wieder festgestellt: Fehler sind trivial. Ich programmiere rein 
hobbymäßig und allein und benötige manchmal ein Forum um mich 
"aufzuschlauen". Dein Hinweis war der Treffer. Ich verwende für die 
Auswertung einer Matrixtastatur einen Zustandsautomat mit Strukturen. 
Der Fehler lag in der Zuweisung dieser "defines", an den 
Programmpositionen musste das "=" Zeichen und nicht "->"
eingesetzt werden. Nach Änderung fehlerfreie Compilirung. Nochmals 
vielen Dank für Deinen Hinweis.

Gruß Heinz
Moderator #6096221
Lesenswert?

Der Compiler zeigt bei Syntaxfehlern, in denen Makros eine Rolle
spielen, üblicherweise auf zwei Stellen im Quellcode, nämlich dorthin,
wo das Makro definiert wurde, und dorthin, wo schließlich der Fehler
erkannt wurde.

Beispiel:

1
test.c:1:32: error: expected identifier before numeric constant
2
    1 | #define TASTENDRUCK_KEINER     0
3
      |                                ^
4
test.c:9:8: note: in expansion of macro ‘TASTENDRUCK_KEINER’
5
    9 |   a -> TASTENDRUCK_KEINER;
6
      |        ^~~~~~~~~~~~~~~~~~

Die erste Meldung sagt aus:

"Da steht irgendwo eine 0, wo eigentlich etwas anderes stehen sollte,
..."

Der Satz ist aber noch nicht zu Ende, sondern wird in der zweiten
Meldung fortgesetzt, die besagt:

"... und dieses "irgendwo" ist die Zeile 9 in "test.c", wo
das fragliche Makro (TASTENDRUCK_KEINER) zu 0 expandiert wird."

Wenn du dir also in

1
a -> TASTENDRUCK_KEINER;

den Makronamen TASTENDRUCK_KEINER durch 0 ersetzt denkst, steht da:

1
a -> 0;

Der "->"-Operator erwartet als linken Operanden einen Zeiger auf ein
Struktur (struct) und als rechten Operanden den Namen eines Elements der
Struktur. In diesem Fall steht da aber kein Name (identifier), sondern
eine Zahl. Und genau diesen Identifier vermisst der Compiler laut seiner
Meldungen.

Auf die Idee, dass die 0 richtig ist und du stattdessen den falschen
Operator ("->" statt "=") verwendet hast, kommt der Compiler leider
nicht. Hier musst du als Programmierer etwas Phantasie beweisen, was du
ja schließlich auch getan hast.
Gast #6096859
Lesenswert?

Yalu X. schrieb:
> Auf die Idee, dass die 0 richtig ist und du stattdessen den falschen
> Operator ("->" statt "=") verwendet hast, kommt der Compiler leider
> nicht.

Das ist das "Schöne" an C-Compilern. Statt auf den naheliegensten Fehler 
hin zu weisen, kommen tiefgreifende Analysen.

Wo ein Turbo Pascal/Delphi ein simples "missing ';'" ausspuckt (und 
damit in 99.9% der Fälle Recht hat), würde entsprechend ein C-Compiler 
sonstwelche Konstrukte auffahren, um dem verbleibenden Quelltext doch 
noch irgend einen Sinn abzugewinnen, aber am End trotzdem gnadenlos zu 
scheitern (mit ein Fehlermeldung, die es zumindest Einsteigern schwer 
macht, ihr überhaupt irgend einen Sinn ab zu gewinnen).
Gast #6096889
Lesenswert?

my2ct schrieb:
> (mit ein Fehlermeldung, die es zumindest Einsteigern schwer
> macht, ihr überhaupt irgend einen Sinn ab zu gewinnen).

Wer die Hälfte von dem ignoriert, was der Compiler ihm sagt, darf sich 
nicht beschweren, wenn er die andere Hälfte nicht versteht. Einfach mal 
die ganze Fehlermeldung lesen.
#6096987
Lesenswert?

Nop schrieb:
> Einfach mal
> die ganze Fehlermeldung lesen.

Genau das ist das Problem: Anfänger lesen üblicherweise die 
Fehlermeldungen gar nicht, oder sie verstehen sie einfach nicht, weil 
dort natürlich die korrekten Fachtermini benutzt werden, die die 
Anfänger wieder nicht kennen, oder zu faul sind, diese zu ergründen.
Das ist bspw. ein Punkt (Fehlermeldungen lesen), der in jedem mir 
bekannten Buch / Kurs viel zu kurz kommt. Was auch wiederum verständlich 
ist, weil die ja wieder Compiler-spezifisch sind.
Persönliche Seite #6096997
Lesenswert?

Heinz W. schrieb:
> expeted identifier befor numeric constant

Ohne weitere Info kann man da nicht weiterhelfen.

Der Compiler gibt Zeilennummern aus, wo der Fehler auftritt.  Allerdings 
gibt es i.d.R. (wesentlich) mehr als 1 Stelle im Code, die man 
korrigieren könnte, um den Fehler an dieser Stelle zu beheben.

Dementsprechend werden Fehler / Warnungen öfter an unerwarteter Stelle 
ausgegeben, eben weil die Stelle nicht eindeutig ist.

Bei Fehlern in / mit Makros kann man sich die präprozessierte Quelle 
anschauen, da sieht man dann, wie die Makros expandiert wurden — 
zumindest falls der Fehler nicht vom Präprozessor selber stammt.

Manchmal hilft auch, -P -save-temps zu dem Optionen hinzuzufügen.  Die 
präprozessierte Quelle wird dann in einem i-File (C), ii-File (C++) oder 
s-File (Assembler) gespeichert.  -P bewirkt, dass sich die Fehlermeldung 
nicht auf die C-Quelle bezieht, sondern auf den Code nach dem 
Präprozessieren, was wiederum das ist, was der eigentliche Compiler 
schließlich sieht.
Moderator #6097088
Lesenswert?

my2ct schrieb:
> Yalu X. schrieb:
>> Auf die Idee, dass die 0 richtig ist und du stattdessen den falschen
>> Operator ("->" statt "=") verwendet hast, kommt der Compiler leider
>> nicht.
>
> Das ist das "Schöne" an C-Compilern. Statt auf den naheliegensten Fehler
> hin zu weisen, kommen tiefgreifende Analysen.

Du hältst es tatsächlich für den naheliegendsten Fehler, dass jemand
"->" statt "=" schreibt? Ich habe diesen Fehler bisher noch nie gesehen,
weder bei mir selber noch bei anderen. Du etwa?

my2ct schrieb:
> Turbo Pascal/Delphi

Ja, ja, ich weiß, in Pascal ist immer alles um Welten besser ;-)

Wirklich?

Schau dir einfach mal folgenden, dem des TE sehr ähnlichen Pascal-Code
an:

1
var i: integer;
2
begin
3
  i . 0
4
end.

Der Programmierer hat hier versehentlich "." statt ":=" geschrieben.

Der FPC sagt dazu:

1
test.pas(3,7) Error: Illegal qualifier
2
test.pas(3,7) Fatal: Syntax error, "identifier" expected but "ordinal const" found

Und jetzt vergleiche mal die Meldung des Pascal-Compilers

1
"identifier" expected but "ordinal const" found

mit der des C-Compilers:

1
expected identifier before numeric constant

Ok, sie Satzstellung ist etwas anders ;-)

Und unter einer "numeric constant" (numerische Konstante) kann sich ein
Anfänger vermutlich sehr viel mehr vorstellen als mit einer "ordinal
const" (Ordnungskonst).
#6097132
Lesenswert?

Johann L. schrieb:
> Bei Fehlern in / mit Makros kann man sich die präprozessierte Quelle
> anschauen, da sieht man dann, wie die Makros expandiert wurden —
> zumindest falls der Fehler nicht vom Präprozessor selber stammt.

Hinzukommt, dass vielen (Anfängern) gar nicht klar ist, dass der 
Präprozessor ein nicht-interaktiver Editor ist. Daher auch die 
unausrottbare Unsitte, funktionsähnliche Macros zu schreiben und sich 
dann über schräge Ergebnisse zu freuen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren