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!
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.
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
troll schrieb: > Btw, du teilst durch Null. Das ist kein Problem, Ergebnis der Berechnung NaN BTW: am besten mit -Wall kompilieren
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.
> 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.
> Das ist kein Problem, Ergebnis der Berechnung NaN
Nein. Es wird ein signal ausgelöst, das unbehandelt das Programm
beendet.
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.
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.
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 :)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.