Forum: Compiler & IDEs fehlerfreies Programm gcc wirft Fehler


von Thomas B (Gast)


Lesenswert?

Hallo,

ich habe folgendes Programm getestet:

#include <stdio.h>

int main()
{
  int a = 2;
  int c;

  // Die fehlerhafte Berechnung
  c = 2 / (a – 2);

  printf("Nach der Berechnung.\n");
  return 0;
}

Ich kann hier absolut keinen Fehler sehen und habe das Programm mit dem 
folgenden Befehl compilieren wollen:

gcc -o test test.c

Ich bekam folgende Fehlermeldung:
test.c: In Funktion »main«:
test.c:9:3: Fehler: verirrtes »\342« im Programm
test.c:9:3: Fehler: verirrtes »\200« im Programm
test.c:9:3: Fehler: verirrtes »\223« im Programm
test.c:9:21: Fehler: expected »)« before numeric constant

Hat jemand von euch eine Idee was der Fehler ist?

Vielen Dank im voraus!

von troll (Gast)


Lesenswert?

Thomas B schrieb:
> test.c:9:3: Fehler: verirrtes »\342« im Programm
> test.c:9:3: Fehler: verirrtes »\200« im Programm
> test.c:9:3: Fehler: verirrtes »\223« im Programm
Guck dir mal deine Datei mit einem Hexeditor an.

von troll (Gast)


Lesenswert?

Btw, du teilst durch Null.

von Moritz M. (moritzm)


Lesenswert?

Das Problem ist, das du nicht-ASCII Whitespaces im programm hast. 
wahrscheinlich von irgendeiner webseite kopiert, richtig?
Ersetze in der fraglichen Zeile alle Leerzeichen mit Leerzeichen von der 
Leertaste

Grüße

von Moritz M. (moritzm)


Lesenswert?

troll schrieb:
> Btw, du teilst durch Null.

Das ist kein Problem, Ergebnis der Berechnung NaN

BTW: am besten mit -Wall kompilieren

von Cyblord -. (cyblord)


Lesenswert?

Das ist Strafe für Copy&Paste ;-)

von Alexander F. (alexf91)


Lesenswert?

Moritz M. schrieb:
> troll schrieb:
>> Btw, du teilst durch Null.
>
> Das ist kein Problem, Ergebnis der Berechnung NaN

Nicht bei Integer Variablen.
2/0 ergibt aber auch bei Gleitkommazahlen kein NaN, sondern +infinity.

von Thomas B (Gast)


Lesenswert?

> Das Problem ist, das du nicht-ASCII Whitespaces im programm hast.
> wahrscheinlich von irgendeiner webseite kopiert, richtig?
> Ersetze in der fraglichen Zeile alle Leerzeichen mit Leerzeichen von der
> Leertaste

Ja ich gebe zu, ich habe den Code von einer Webseite kopiert und genau 
das war der Fehler. Eigentlich wollte ich nur ausprobieren ob der 
richtig Fehler über die Linux shell ausgegeben wird.

Problem war übrigens das Minuszeichen.

Danke nochmal für die schnelle Hilfe.

von casud (Gast)


Lesenswert?

> Das ist kein Problem, Ergebnis der Berechnung NaN

Nein. Es wird ein signal ausgelöst, das unbehandelt das Programm 
beendet.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da hier sowieso gerade kluggesch...en wird ;-)

Dass die HTML-Seite den Halbgeviertstrich als Minuszeichen missbraucht,
ist ja schon sehr daneben. Halbwegs logisch wäre allenfalls noch das
mathematische Minuszeichen, auch wenn der C-Compiler dieses ebenfalls
beanstanden würde.

Hier sind mal die drei angesprochenen Strichvarianten im Vergleich:

  c = 2 / (a - 2);  // HYPHEN-MINUS  (Minuszeichen in C)
  c = 2 / (a − 2);  // MINUS SIGN    (mathematisches Minuszeichen)
  c = 2 / (a – 2);  // EN DASH       (Halbgeviertstrich)

Wer genau hinschaut, kann sicher den Unterschied erkennen.

Und damit die Sache nicht zu einfach wird, kennt Unicode noch eine ganze
Reihe weitere Strichsymbole :)

Ein ähnlicher Stolperstein beim Copy/Paste von Webseiten sind übrigens
die einfachen und doppelten Anführungzeichen (' und ") bei Character-
und String-Literalen. Auf Webseiten werden dafür oft die typographischen
Varianten verwendet, die in C ebenfalls zum Fehler führen.

von Rolf Magnus (Gast)


Lesenswert?

Die Frage ist nur, wie man auf die blöde Idee kommen kann, auf einer 
Webseite auch in Beispiel-C-Code solche Unicode-Zeichen zu verwenden. 
Das muß ja zwangsläufig zu Fehlern und zu Verwirrung führen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Rolf Magnus schrieb:
> Die Frage ist nur, wie man auf die blöde Idee kommen kann, auf einer
> Webseite auch in Beispiel-C-Code solche Unicode-Zeichen zu verwenden.

Möglicherweise trieb auch ein HTML-Konverter sein Unwesen, oder jemand
hat es versäumt, das Auto"korrektur"-Feature von Word auszuschalten.

Das der gepostete Quellcode stammt übrigens von hier:

  http://openbook.galileocomputing.de/linux/linux_kap05_003.html

Interessant ist auch dieses hier vom gleichen Verlag:

  http://openbook.galileocomputing.de/c_von_a_bis_z/003_c_grundlagen_001.htm#mj6cc85534f12d7e0868b75171de8d087e

Da werden alle in C erlaubten Zeichen aufgelistet, aber zwei davon sind
garantiert nicht erlaubt, nämlich der Gedankenstruch (–) statt dem
Minuszeichen (-) und das schließende einfache Anführungszeichen (’)
statt dem Apostroph (').


In den Code-Beispielen auf dieser Seite sind die Minuszeichen allerdings
richtig geschrieben:

  http://openbook.galileocomputing.de/c_von_a_bis_z/006_c_operatoren_001.htm#mjab3693b096d581607801a36ce88905fc


P.S.: In Haskell sind auch Gedankenstriche u.ä. als Operatoren erlaubt,
wenn man sie mit einer Funktion belegt. Man könnte also alle minusähn-
lichen Unicode-Zeichen mit der Subtraktion belegen, damit sie das tun,
was von ihnen erwartet wird.

Oder man könnte sie obfuszierenderweise mit unterschiedlichen Funktionen
belegen wie in folgendem Beispiel:
1
(–) = (+)
2
(—) = (*)
3
(−) = (/)
4
5
x = 10 — 4 − 3 – 2 - 1

Dann ist x nicht 0, sondern 14.33333 :)

von Moritz M. (moritzm)


Lesenswert?

Alexander F. schrieb:
> Moritz M. schrieb:
>> troll schrieb:
>>> Btw, du teilst durch Null.
>>
>> Das ist kein Problem, Ergebnis der Berechnung NaN
>
> Nicht bei Integer Variablen.
> 2/0 ergibt aber auch bei Gleitkommazahlen kein NaN, sondern +infinity.

Wieder was gelernt :-) musste es gerade ausprobieren:

[1]    4126 floating point exception (core dumped)  ./main

was mich wundert ist "floating point exception" bei ints?

Grüße

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Moritz M. schrieb:
> was mich wundert ist "floating point exception" bei ints?

Das Signal heißt eben einfach so (SIGFPE).  Man hat nun für die
Division durch Null bei Integerwerten nicht noch eins extra
erfinden wollen.  (In der Zeit vor all den Infinities und NaNs
wurde das auch bei einer Gleitkommadivision durch 0 geworfen.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.