C für Dummies. Dan GookinЧитать онлайн книгу.
wissen Sie ja jetzt, wie man mit Fehlern umgeht.
Sie können nun das Programm starten und die Ausgabe bewundern:
Dieses Programm arbeitet fehlerfrei!
Ich kann Ihnen nicht immer sagen, wo die Fehler in Ihrem Programm stecken. Error.c
ist das einzige Programm im Buch, das einen absichtlichen Fehler enthält. Wenn Sie auf einen Fehler treffen, sollten Sie die Fehlermeldung untersuchen, um den Ort und Grund des Fehlers einzukreisen. Danach überprüfen Sie den eingetippten Quelltext anhand des im Buch angegebenen Quelltextes. Auf diese Weise finden Sie, was falsch ist. Aber wenn Sie ganz allein unterwegs sind und eigene Programme schreiben, dann hilft Ihnen wirklich nur die Fehlermeldung bei der Jagd nach dem Übeltäter.
Damit müssen Sie sich nicht belasten
Es gibt zwei Arten von Fehlern: Fehler und Warnungen. Manche Compiler nennen Fehler auch kritische Fehler.
Eine Warnung bedeutet so viel wie »Also appetitlich siehtʼs ja nicht gerade aus, aber ich serviere es trotzdem«. Wahrscheinlich wird Ihr Programm laufen, aber eventuell nicht ganz so wie gewünscht. Oder vielleicht ist der Compiler auch nur besonders sorgfältig. Bei den meisten Compilern kann man einige der übergenauen Warnungen ausschalten.
Der Fehler, oder auch kritische Fehler, bedeutet: »Herrscher über meinen Speicher, du hast etwas so Kriminelles getan, ich kann es nicht verantworten, dieses Programm laufen zu lassen«. Vielleicht ist das ein bisschen übertrieben. Letztlich ist der Compiler aber nicht in der Lage, Ihre Anweisungen zu verstehen.
Die fürchterlichen Linkerfehler
Beenden Sie das Error.c
-Projekt noch nicht. Falls Sie zu schnell waren, öffnen Sie die Quelltextdatei wieder.
Ändern Sie die dritte Zeile im Quelltext, sodass sie wie folgt aussieht:
int Main()
Falls es Ihnen nicht auffällt, das Wort main
wurde in Main
geändert, ein häufiger Tippfehler. Aber dies ist kein Syntaxfehler. C arbeitet so, dass es einfach annimmt, dass Main
irgendetwas Ernsthaftes ist und dass es funktionieren wird. Aber der Linker, der die Programmteile miteinander verbindet, findet den Fehler, wenn er sich darüber wundert, wo denn eigentlich die Funktion main
zu finden sein soll. Denn wie Sie im nächsten Abschnitt erfahren werden, muss jedes C-Programm eine Funktion main
enthalten.
Speichern Sie die Datei und kompilieren Sie das Programm neu.
Es gibt einen Fehler! Schauen Sie sich an, wie eine mögliche Ausgabe aussehen könnte:
undefined reference to 'WinMain'
error: ld returned 1 exit status
Es ist schwieriger, den Fehler zu finden, weil bei Linkerfehlern keine Zeilennummern angegeben werden.
Es ist schwieriger, Linkerfehler zu akzeptieren als Compilerfehler, wo doch der Compiler automatisch für Sie linkt. Aber es passiert dennoch. Und anders als beim Compiler sind hier alle Fehler »kritisch«.
Linkerfehler beheben
Die Aufgabe des Linkers ist es, das Programm aus Einzelteilen zusammenzusetzen. Wenn er etwas findet, das er nicht erkennt, denkt er: »He, das könnte etwas aus einem anderen Programmteil sein«. Daher rutscht der Fehler zunächst beim Compiler durch. Aber wenn der Linker nachsieht, wo das unbekannte Wort definiert ist, hält er dann seine Fehlerflagge mit aller Gewalt hoch, wenn er nichts findet.
Um Linkerfehler zu beheben, folgen Sie den gleichen Schritten wie bei der Behebung von Compilerfehlern. Mit der Fehlermeldung als Führer suchen Sie die verursachende Zeile im Quelltext. Dann beheben Sie den Tippfehler oder den Fehler, um das Programm zu korrigieren.
Ändern Sie also die Zeile mit dem Main
wie folgt:
int main()
Speichern Sie die Änderung und erzeugen Sie das Programm neu. Nun sollte kein Fehler mehr angezeigt werden.
Bei Linkerfehlern wird in der Regel keine Zeilennummer angegeben, aber man sieht zumindest den beanstandeten Begriff. Benutzen Sie die Suchfunktion des Texteditors, um nach dem Begriff im Quelltext zu suchen. Die Beseitigung läuft immer gleich, egal, welchen Grund es gibt: ändern und neu kompilieren.
Linkerfehler bedeuten, dass das Programm nicht erzeugt wurde. Das ist gut, denn ohne das fehlende Stück würde die exe
-Datei Ihren Computer abstürzen lassen.
Alles über Fehler
Eine häufig vorkommende Aussage in der Computerprogrammierung ist, dass man häufiger Fehler beseitigt als Programme schreibt. Fehler sind überall, und die Beseitigung kann Jahre dauern, deswegen ist es auch so schwierig, gute Software zu schreiben.
Syntaxfehler: Die häufigsten und am leichtesten zu findenden Fehler; der Compiler entdeckt diese Fehler bei der Übersetzung des Quelltextes. Die meisten Syntaxfehler sind Tippfehler oder ähnliche Kleinigkeiten. Normalerweise zeigt der Compiler diese mit genauem Ort und Grund an.
Linkerfehler: Kommen als Erstes ins Spiel, wenn Anweisungen falsch geschrieben werden. In fortgeschrittener Programmierung, wenn man mit vielen Quelltextdateien oder Modulen arbeitet, deuten Linkerfehler auf fehlende oder fehlerhafte Module hin. Außerdem kann dies passieren, wenn der Linker eine spezielle Bibliotheksdatei (Library oder kurz Lib) sucht und nicht findet. Auch hier wird ein Linkerfehler mit einem etwas anderen Text erzeugt.
Laufzeit- oder Runtimefehler: Ereignen sich, während das Programm läuft. Dies sind keine Bugs – das sind Dinge, die für Compiler und Linker absolut akzeptabel sind, aber nicht genau das, wofür sie eigentlich von Ihnen gedacht waren (das ist in C nichts Ungewöhnliches). Der häufigste Laufzeitfehler ist ein Zugriff auf einen Nullzeiger. Geduld, das lernen Sie noch später.
Bugs: Der schwierigste Typ Fehler, dem Sie begegnen. Der Compiler erzeugt exakt das Programm gemäß Ihren geschriebenen Anweisungen, aber ob das Programm das Gewünschte tut, stellt sich erst bei Tests heraus. Falls nicht, müssen Sie am Quelltext noch etwas arbeiten. Bugs umfassen alles von zu langsamer Geschwindigkeit bis zu Dingen, die nur manchmal oder gar nicht funktionieren. Diese Fehler sind am schwersten zu entdecken und ein hochgradiger Frustrations- und Demotivationsgrund. Übrigens auch für Ihre Anwender oder Kunden.
Wie die Sprache C aussieht
Jede neue Sprache wirkt verwirrend auf Sie. Ihre Muttersprache hat einen bestimmten Verlauf oder ein Wortmuster. Und die ganzen Buchstaben passen irgendwie zueinander. An fremde, neuartige Dinge gewöhnt man sich am besten durch Übung und Benutzung. Aber Sie brauchen eine Straßenkarte, damit Sie die Dinge einordnen können. Es macht keinen Sinn, blind ein C-Programm einzutippen, wenn Sie nicht die geringste Ahnung haben, was abläuft.
Der große Zusammenhang
Abbildung 2.2 stellt den Quelltext von Goodbye.c
dar, das Beispiel vom Anfang dieses Kapitels.
Abbildung 2.2: Goodbye.c und seine Bestandteile
Jedes Programm benötigt einen Einsprungpunkt. Wenn Sie ein Programm starten, wird es vom Betriebssystem