Brei Geschrieben 2. Januar 2004 Geschrieben 2. Januar 2004 was versteht man unter "semantische" Fehler beim Programmieren? Zitieren
Guybrush Threepwood Geschrieben 3. Januar 2004 Geschrieben 3. Januar 2004 Semantische Fehler sind Fehler in der Programmlogik. Also so was z.b.: int i; do { printf("Bitte eine Zahl zwischen 1 und 4 eingeben: "); scanf("%i",&i); } while(i < 5); [/PHP] Das Programm verlangt nach einer Zahl zwischen 1 und 4, die Schleife läuft aber so lange wie die Zahl kleiner als 5 ist. Wie du dir sicher denken kannst können solche Fehler nicht vom Compiler festgestellt werden. Das Gegenteil dazu sind syntaktische (bzw. Syntax) Fehler, welche bedeuten das z.b eine Variable nicht existiert oder so. Diese können vom Compiler festgestellt werden. Gruß Guybrush Zitieren
Klotzkopp Geschrieben 3. Januar 2004 Geschrieben 3. Januar 2004 @Guybrush Threepwood: Dein Beispiel ist AFAIK ein logischer Fehler. Ein semantischer Fehler wäre etwas, was zwar syntaktisch korrekt ist, aber im Zusammenhang, wenn man die Bedeutung der Bezeichner und Operatoren berücksichtigt, falsch ist. Zwei Beispiele in C++: a = b + c; Das ist syntaktisch korrekt, aber wenn b und c Zeiger sind, semantisch falsch, weil man zwei Zeiger nicht addieren kann. a = b(); Das ist auch syntaktisch richtig. Wenn b aber weder eine Funktion noch eine Instanz einer Klasse mit operator() ist (sondern z.B. nur ein einfacher int), geht das trotzdem nicht. Der Compiler kann solche Fehler durchaus finden. Zitieren
Guybrush Threepwood Geschrieben 3. Januar 2004 Geschrieben 3. Januar 2004 Oh...ich dachte bisher immer das sematische Fehler das selbe wie logische Fehler wären. Danke für die Korrektur Zitieren
Timon Geschrieben 6. Januar 2004 Geschrieben 6. Januar 2004 oder auch sehr häufig in C: if (a= {} statt: if (a== {} Zitieren
gajUli Geschrieben 6. Januar 2004 Geschrieben 6. Januar 2004 Original geschrieben von DingDong if (a= {} statt: if (a== {} Wobei sich da aber die Frage stellt, ob das ein semantischer Fehler ist. Syntaktisch geht ja beides. Die erste Variante kann theoretisch sinnvoll sein. Vielleicht ist es doch eher zu den logischen Fehlern zu rechnen. Semantische Fehler sind m. W. Daten, die sinnlos sind, weil sie eine falsche bzw. nichtige Bedeutung haben wie z. B. "35. Januar". Zitieren
gajUli Geschrieben 6. Januar 2004 Geschrieben 6. Januar 2004 Original geschrieben von Klotzkopp @Guybrush Threepwood: Dein Beispiel ist AFAIK ein logischer Fehler. Ein semantischer Fehler wäre etwas, was zwar syntaktisch korrekt ist, aber im Zusammenhang, wenn man die Bedeutung der Bezeichner und Operatoren berücksichtigt, falsch ist. Kann man aus dem Beispiel heraus ueberhaupt entscheiden? Wenn der Fehler in der Bedingung hinter dem while liegt, ist es sicher ein logischer Fehler. Kann aber auch sein, dass der Meldetext eine fehlerhafte Bedeutung hat; dann wuerde ich das als semantischen Fehler ansehen. Zitieren
nic_power Geschrieben 6. Januar 2004 Geschrieben 6. Januar 2004 Hallo, Original geschrieben von gajUli Die erste Variante kann theoretisch sinnvoll sein. Nicht nur theoretisch sondern auch praktisch. if (a= {} ist gleichzusetzen mit if (a=malloc(...)) {}. Derartige Konstrukte sind integraler Bestandteil eine jeden C-Programms. Nic Zitieren
gajUli Geschrieben 7. Januar 2004 Geschrieben 7. Januar 2004 Original geschrieben von nic_power >Nicht nur theoretisch sondern auch praktisch. if (a= {} ist gleichzusetzen mit if (a=malloc(...)) {}. Ich seh das so: a wird mit dem Wert von b ueberschrieben und die if-clause mit diesem Wert ausgewertet. Darum erzeugt das hier #include <stdio.h> int main(void) { int a=1,b=2; if (a= printf("%d %d",a,; return 0; }[/PHP] den simplen Output "2 2". Ich wuesste allerdings nicht, wieso dafuer eine Memory Allocation ablaufen sollte; laeuft doch alles mit Stack und Registern. Zitieren
nic_power Geschrieben 7. Januar 2004 Geschrieben 7. Januar 2004 Hallo, malloc() war auch nur ein Beispiel. Ich wollte eigentlich darauf hinaus, dass es in C/C++ üblich ist, Zuweisungen innerhalb eines Vergleichs vorzunehmen. D.h. Konstrukte der Art if (a= sind eher die Regel, sofern b eine Funktion ist die ein Ergebnis zurückliefert. Was man ebenfalls häufiger sieht: char *a, *b; b=function(); if (a= { ... } else { ... } [/code] Ist zwar nicht elegant und verleitet zu Fehlern (da nicht wirklich klar ist, ob "if (a=b)" auch so gemeint ist, wies im Code steht), wird aber gerne verwendet. Nic Zitieren
Timon Geschrieben 7. Januar 2004 Geschrieben 7. Januar 2004 Meinst du b=function(); oder b=function; ? Zitieren
nic_power Geschrieben 7. Januar 2004 Geschrieben 7. Januar 2004 Hallo, den ersten Fall, also b=function(); wobei der zweite Fall ebenfalls möglich - aber in diesem Zusammenhang nicht sinnvoll - wäre (das Ergebnis der if-Abfrage ist immer "true"). Nic Zitieren
Tapeman Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Hallo, bei if (a= {}; ist das Ergebnis doch eigentlich nur dann true, wenn b>0. >0 =^= TRUE =0 =^= FALSE Nochmal auf Semantikproblem zurück zukommen, definieren eigentlich nicht die Datentypen den Syntax? --- Sind vielleicht nicht doch alle Fehler, logische Fehler? ;-) Zitieren
Klotzkopp Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Original geschrieben von Tapeman Nochmal auf Semantikproblem zurück zukommen, definieren eigentlich nicht die Datentypen den Syntax?Nein, zum Zeitpunkt der Syntaxanalyse gibt es noch keine "Datentypen". Die Syntax für eine if-Anweisung könnte z.B. so aussehen: if(Ausdruck) Anweisung Sowohl für Ausdruck als auch für Anweisung gibt es wieder eigene Syntaxregeln. Ein Ausdruck könnte z.B. sein: Ausdruck BinärerOperator Ausdruck oder nur Bezeichner Damit ist a = b ein syntaktisch gültiger Ausdruck. Wenn jetzt b nicht an a zugewiesen werden kann (z.B. weil kein passender Zuweisungsoperator vorhanden ist), dann ist das semantisch falsch. Wenn == gemeint war, ist es logisch falsch. Sind vielleicht nicht doch alle Fehler, logische Fehler? ;-) Nein. Das hier sind ziemlich sicher Syntaxfehler: if(a=) if a= if(a=if) Zitieren
Tapeman Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Nagut, das meine ich gar nicht mal, klar if(a={} ist syntaktisch korrekt, obwohl es eigentlich auch nicht schlecht wäre, wenn es einer wäre, dann könnte man nämlich die Tippfehler erkennen. Aber bei Ausdr BinOp Ausdr ist das Ergebnis des binären Operators ist doch auch ein Ausdruck. Kann man vielleicht folgendes sagen: Syntax=Grammatik/Form. Semantik=Inhalt. Syntaxfehler: Der Compiler ist nicht in der Lage den Code in Assembler zu übersetzen. Semantikfehler: Der Compiler ist zwar i.d. Lage d. Code in Assembler zu übersetzen, übersetzt aber das vermeidlich richtige. ----- Man könnte ja doch theoretisch sagen, die Syntax ist die erste Dimension, die Semantik die zweite Dimension. Gruß Tapeman Zitieren
Tapeman Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Was dummes nebenbei, kann mir jemand folgendes erklären? void main(void) { 5; // Ausdruck; ???? kein syntakt. Fehler }; Gruß Tapeman Zitieren
Klotzkopp Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Original geschrieben von Tapeman Syntaxfehler: Der Compiler ist nicht in der Lage den Code in Assembler zu übersetzen. So kann man das nicht sagen. Die Syntaxprüfung beinhaltet nur, ob der Quelltext der Struktur der jeweiligen Programmiersprache entspricht. Da ist noch nichts übersetzt. Die Trennung zwischen semantischem Fehler und logischem Fehler ist nicht immer eindeutig möglich, es hängt auch oft von der Absicht des Programmierers ab, und die kann der Compiler nicht kennen. Was dummes nebenbei, kann mir jemand folgendes erklären? void main(void) { 5; // Ausdruck; ???? kein syntakt. Fehler }; Das ist völlig korrekt so. Eine Anweisung kann aus einem Ausdruck, abgeschlossen mit einem Semikolon, bestehen, und ein numerisches Literal ist auch ein Ausdruck. Dass der "Wert" dieses Ausdrucks nicht weiterverarbeitet wird, macht ja nichts. Nachtrag: Ein Compiler dürfte sich aber laut Standard über "void main" beklagen. Das wäre dann IMHO ein semantischer Fehler. Zitieren
Brei Geschrieben 14. Januar 2004 Autor Geschrieben 14. Januar 2004 Original geschrieben von Klotzkopp Ein Compiler dürfte sich aber laut Standard über "void main" beklagen. Aber es kann doch sein, dass kein Rückgabewert kommt? Unser Leher hat uns das schon so gezeigt Zitieren
Orffi Geschrieben 14. Januar 2004 Geschrieben 14. Januar 2004 Ok, ich versuche auch mal ein wenig Licht ins Dunkle zu bringen. Die Frage nach void main (void) ist meiner Meinung nach nicht so einfach zu beantworten. Denn es gibt ja genügend Compiler, die das so unterstützen. Allerdings muß man bedenken, daß man dann nicht mehr Ansi-C oder Iso-C++ programmiert, sondern nur in einer Sprache, die den beiden genannten Sprachen sehr, sehr ähnlich ist. Ich würde also void main (void) im Standard C/C++ Forum für falsch ansehen, aber außerhalb des Forum als "Feature" der Entwicklungsumgebung. Ich würde dafür plädieren, void main (void) aus der "semantischer Fehler"-Diskussion herauszuhalten, weil das eher verwirrt. Ein Beispiel für einen semantischen Fehler: Die Sonne ist grün. Dieser Satz ist, wenn man sich ihn auf der syntaktischen Ebene ansieht, ein korrekter Satz. Im Gegensatz zu: Die grün Sonne ist. Dieser Satz ist syntaktisch falsch. Aber die Sonne ist nicht grün... Semantik kann man mit Inhalt gleichsetzen (also zumindestens in diesem Zusammenhang). Also ist: "Die Sonne ist grün" ein semantischer Fehler, weil der Satz inhaltlich nicht richtig ist. (Welche Farbe die Sonne nun wirklich hat, will ich hier jetzt außen vor lassen, denn als es in Kanada einen riesigen Waldbrand gab, erschien die Sonne tatsächlich grün. Und auch die Atmosphäre verschiebt die Sonnenfarbe ins gelbliche. Im Weltraum sollte die Sonne einen Blaustich haben...) HTH Jan Zitieren
Tapeman Geschrieben 19. Januar 2004 Geschrieben 19. Januar 2004 Hallo, void main(void) ist geklärt, daß die Sonne im All einen leichten Blaustich hat auch, aber verstehe ich nicht was der Ausdruck "5;" nun so richtig bewirkt, zwar ist er richtig, aber was macht "5;" ? Schreibt er eine 5 in den Stack ? :-) Gruß Tapeman Zitieren
nic_power Geschrieben 19. Januar 2004 Geschrieben 19. Januar 2004 Hallo, Original geschrieben von Tapeman aber verstehe ich nicht was der Ausdruck "5;" nun so richtig bewirkt, zwar ist er richtig, aber was macht "5;" ? Schreibt er eine 5 in den Stack ? :-) Gar nichts. Ein guter Compiler optimiert die "5" einfache weg und erzeugt ein leeres Main-Programm. Ein schlechter Compiler legt die "5" ins Datensegment (das Programm ist dann etwas größer, tut aber immer noch nichts, da keinerlei Funktion aufgerufen wird). Nic Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.