Forum: Compiler & IDEs Fehlermeldung: expected identifier before numeric constant


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Heinz W. (bibermann)


Bewertung
0 lesenswert
nicht 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

von g457 (Gast)


Bewertung
0 lesenswert
nicht 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.

von Karl M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Heinz W. schrieb:
> #define TASTENDRUCK_KEINER     0
> #define TASTENDRUCK_GEDRUECKT  1
> #define TASTENDRUCK_WIEDERHOLT 2
> #define TASTENPHASE_NORMAL     0
> #define TASTENPHASE_ENTPRELLEN 1
> #define TASTENPHASE_WIEDERHOLT 2

Das ist noch eine Textersatzdefinition, die kein Code erzeugt!

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Heinz W. schrieb:
> 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

Dann zeige doch bitte die betreffenden Zeilen deines Programms.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Heinz W. schrieb:
> expeted identifier befor numeric constant

Wenn der Compiler das ausgibt, ist er kaputt. Du solltest ihn löschen
und von einer sicheren Quelle erneut installieren.

Edit: Ok, im Threadtitel ist es richtig geschrieben. Trotzdem liegt der
Fehler nicht in den von dir geposteten Zeilen, sondern woanders.

: Bearbeitet durch Moderator
von PittyJ (Gast)


Bewertung
0 lesenswert
nicht 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.

von Micha (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du musst im deinem Quellcode an den Verwendungsstellen der defines 
nachschauen. Dort passiert der Fehler.

von Heinz W. (bibermann)


Bewertung
0 lesenswert
nicht 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

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht 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:

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

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

a -> TASTENDRUCK_KEINER;

den Makronamen TASTENDRUCK_KEINER durch 0 ersetzt denkst, steht da:

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.

: Bearbeitet durch Moderator
von Heinz W. (bibermann)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Yalo,

danke für den Hinweis. Ich bin fürjeden Tip dankbar.

Gruß Heinz

von my2ct (Gast)


Bewertung
-1 lesenswert
nicht 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).

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
my2ct schrieb:
> die es zumindest Einsteigern schwer
> macht,

für die ist C auch nicht gemacht.

von Nop (Gast)


Bewertung
0 lesenswert
nicht 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.

von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht 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.

von Johann L. (gjlayde) Benutzerseite


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht 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:

var i: integer;
begin
  i . 0
end.

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

Der FPC sagt dazu:

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

Und jetzt vergleiche mal die Meldung des Pascal-Compilers

"identifier" expected but "ordinal const" found

mit der des C-Compilers:

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).

: Bearbeitet durch Moderator
von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht 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

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.