Parameterkonzept und Fehler

Fehler - Die Suche und Behebung

Die Anfänge der Programmierung sind für die meisten Leute nicht leicht. Zum einen darf man sich mit der dazugehörigen Sprache und deren Syntax auseinandersetzen und dann machen eingebaute Fehler einem auch noch das Leben schwer, welche meist bis zur Kompilierung unerkannt bleiben.

Diese äußern sich meist bei der Kompilierung des Programms, d.h. der Umsetzung zu einem ausführbaren Programm in Maschinensprache, anhand von oft rätselhaften und schwer zu verstehenden Meldungen.

Einige weitverbreitete Fehler dieser Art sind falsch deklarierte Variablen oder Konstanten, ein Bezug auf eine nicht erklärte Variable und falsche Zeichensetzung, wie das Vergessen einer Klammer oder bei pascalorientierten Sprachen das berüchtigte Vergessen eines Semikolons ";". Diese offensichtlichen Fehler werden als syntaktische (oder grammatikalische) Fehler bezeichnet.

Etwas tückischer sind die sogenannten logischen Fehler, da diese vom Compiler nicht angezeigt werden können. Das Programm folgt dabei den Anweisungen des Programmierers und scheint fehlerfrei zu sein, da keinerlei syntaktische Meldungen angegeben werden. Doch die Logik, die dahinter steckt, ist falsch und führt bei komplizierten Rechnungen zu falschen Ergebnissen. Manchmal führen diese Fehler aber auch zu Situationen, die wiederum ein Computer erkennen kann. Solch ein Zustand kann auf einem übermäßig großen numerische Wert beruhen (Übersteigung der größten zu verarbeitenden Zahl) oder eine Verletzung von mathematischen Regeln, wie z.B. das Wurzelziehen aus einer negativen Wurzel. Bei solchen Meldungen, die meistens den Abbruch des Programms bedeuten, kann der Fehler leichter erkannt und entsprechend verbessert werden. Diese Meldungen werden manchmal auch Laufzeitfehler genannt, um eine Unterscheidung zu den anderen beschriebenen Fehlern hervorzuheben.

Um den eingebauten Fehlern auf die Schliche zu kommen, ist ein hartes Stück Detektivarbeit zu verrichten, denn es ist durchaus nicht ungewöhnlich, dass diese trotz mehrmaligen Durchsehens nicht aufzufinden sind. Dieser Prozess wird logische Fehlersuche genannt.

Eine Methode ist es, einen Test mit Daten durchzuführen, deren Ergebnis bereits bekannt ist. Wird jenes Ergebnis nicht erreicht, so enthält das Programm einen Fehler, andererseits bedeutet dies jedoch nicht, dass das Programm fehlerfrei ist, da einige Fehler nur unter bestimmten Bedingungen unrichtige Ergebnisse bewirken. Je vielfältiger die Testdaten sind, um so höher ist die Wahrscheinlichkeit, dass sämtliche mögliche Bedingungen abgerufen werden (ausgiebig testen).

Für die Behebung von Fehlern, in der Fachsprache wird vom "debugging" gesprochen, es heißt Entlausung und stammt von dem englischen Wort "bug" (Ungeziefer), wird sehr oft eine Technik angewendet, die als "Tracen" bezeichnet wird. Hierbei wird das ursprüngliche Programm so weit verändert, dass eine Ausgabe von Zwischenergebnissen stattfindet. Diese Technik ermöglicht einem die genauere Lokalisierung und damit auch die Möglichkeit zur Behebung eines logischen Fehlers.

Umsetzung der Fehlerproblematik im Unterricht

Diese Thematik ist für den Anfangsunterricht der Programmierung in der Informatik unumgänglich, denn schon bei den ersten Umsetzungen werden genau diese Fälle eintreffen, welche wir alle so lieben. Das geschriebene Programm lässt sich aufgrund fehlender Zeichen nicht starten, deklarierte Variablen wurden in einem falschen Zusammenhang verwendet, zu berechnende Ergebnisse werden falsch ausgegeben und sämtliche Schüler und Schülerinnen richten sich mit ihren Fragen an den Lehrer. In dieser Situation heißt es nun Ruhe bewahren, denn aus meiner Sicht muss sich nun jeder einzelne selbst dahinter klemmen, um aus seinen selbstproduzierten Fehlern lernen zu können. Es hat nicht viel Sinn sie mit theoretisch zusammengebastelten Fehlern an der Tafel zu nerven, denn in solchen Momenten schalten die Schüler eher ihre grauen Zellen ab als aus diesen Dingen einen eventuellen späteren Nutzen zu ziehen.

„Diese Fehler sind nicht realistisch“, „So etwas wird mir nicht passieren“ und ähnliche Aussagen würde man nun zu hören bekommen. Beim Programmieren sind die Fehlerquellen sehr vielseitig, Schusseligkeitsfehler, die sich nicht so schnell finden lassen bis hin zu den komplexeren, wo man mehrere Stunden vor dem Rechner verbringt und den Quellcode schon fast auswendig herunterbeten kann.

Auch wenn diese Methode „aus Fehlern lernt man“ sehr zeitaufwendig ist, stellt diese doch auf längerer Sicht gesehen die besten Voraussetzungen zur Verfügung; Eigenständigkeit; Systematische Suche und Korrektur, Dinge, welche man nicht von jetzt auf gleich erreichen, aber durchaus trainieren kann.

Lassen Sie den Schülern ein wenig Zeit sich auszuprobieren und geben Sie nur Hinweise zu den Fehlern, wenn diese nicht sofort erkannt werden, denn die Schüler sollen aus eigener Kraft darauf kommen. Wenn sie nun ein bisschen Erfahrung damit haben, kann man auf theoretischer Ebene die Fehlerproblematik ein wenig vertiefen, indem man jenen mitteilt, was für Typen von Fehlern existieren und mit ihnen ein oder zwei Fehler aus ihrem Erfahrungsschatz zuordnen. Es werden bestimmt eine Menge an Zuordnungen erfolgen, auch solche, an die man persönlich gar nicht mehr denken mag. An dieser etwas spielerischen Gestaltung wird der Unterricht bestimmt sehr von dem Aufblühen und Anreizen profitieren und den Lernerfolg höher (aber dennoch unbewusst) erscheinen lassen.

Ein sehr interessantes Beispiel stellt das von uns gegebene Programm „quadrieren“ dar, was, wie der Name es schon angibt, eine Zahl mit sich selber multipliziert. Es ist sehr einfach gehalten worden, besteht aus einer übersichtlichen Oberfläche, der Hauptunit „UnitMain“ und einer weiteren Unit mit dem Namen „Rechnen“.

Anfangs sollen die Schüler und Schülerinnen das Programm erst einmal ohne jegliche Ausführung erkunden, um sich mit der Programmstruktur, den verwendeten Prozeduren, dem Nutzen etc. vertraut zu machen. Erst danach sollte das Programm gestartet und auch getestet werden. Nach dem Drücken der Taste F9 wird es sofort gestartet und stellt auf seiner grafischen Oberfläche ein Feld zur Eingabe einer Zahl zur Verfügung. Ist diese eingegeben worden, sollte der Button „Rechnen“ gedrückt werden, um festzustellen, dass im Endeffekt nicht der berüchtigte Effekt zu sehen ist. Bei der Ausführung sind keine Fehler ersichtlich geworden und dennoch ist hier, die Übersichtlichkeit erweist sich als sehr nützlich, einer vorhanden. Auch beim weiteren Anschauen wird dem Anwender das Gefühl übermittelt, dass das Programm in einem korrekten Zustand vorliege.

Der eingebaute Fehler ist in der vorliegenden Unit „Rechnen“ zu finden, direkt an der Stelle der Variabelendeklaration der Prozedur „quadriere“. Im vorliegenden Fall gelangt die eingegebene Zahl in die Prozedur und wird mit sich selbst multipliziert. Doch das berechnete Ergebnis kann nicht zurückgegeben werden, da es sich bei der Komponente „ergebnis“ um eine Konstante, eine Zahl mit einem festgelegten Wert handelt.

Erst mit dem Schlüsselwort „var“ wird dem Computer die Situation deutlich, dass es sich bei dieser Komponente um einen variablen Zahlenwert handelt, welcher jeder Zeit einer Veränderung unterliegen kann.

procedure quadriere(zahl:integer; var ergebnis:integer);

Jetzt kann die ausgerechnete Zahl zum Programmhauptteil gelangen, um dort in einem separaten Feld ausgegeben zu werden. Auch weitere Tests ergeben, dass das restliche Programm für ganzzahlige Werte funktioniert, was eine Fehlerfreiheit vermuten lässt.

Ganz praktisch finde ich die Verwendung der Variabelenübergabe in dem gegebenen Programm „quadrieren“. Damit wäre unter anderem die Einführung dieser Struktur möglich, was natürlich eine gewisse theoretische Vorarbeit in Form einer lehrerorientierten Unterrichtsumgebung nötig machen würde. Es ist natürlich anspruchsvoll gleich mit einer recht schwierigen Problematik anzukommen, obwohl dem Schüler bzw. der Schülerin die praktische Verwendung der Variabelenübergabe noch fehlt und er bzw. sie vollkommen darauf angewiesen ist, die Theorie schnell in die Praxis umzusetzen. So müssen sie sich gleich mit der Materie beschäftigen und lernen zudem auch sofort einen recht verbreiteten Fehler kennen, welcher gerne mal übersehen wird und somit zu falschen Ergebnissen führt.

Zum Abschluss lässt sich aber auch noch sagen, dass zur Übung von Fehlerbeseitigungen natürlich auch andere Fehler im Programm eingebaut werden dürfen, wobei diese dann beim Programmstart sichtbar werden, um eventuelle (noch) unbekannte Fehler zu provozieren, die bei der oben erwähnten Einordnung der Fehlertypen nicht erwähnt wurden, da sie entweder in Vergessenheit geraten oder noch unbekannt sind. Auf alle Fälle wird hiermit ein recht großer Beitrag für das Verständnis und der systematischen Suche von Fehlern geleistet.

Aber auch ein anderer Gedanke ließe sich mit diesem Programm verbinden, was allerdings in unserem Konzept nicht vorgesehen ist. Auch fortgeschrittene Kurse können auf diese Art ihre Kenntnisse in der Variabelenübergabe wieder auffrischen, es gilt vor allem dann, wenn man auf anständige Programmierung großen Wert legt und Übersichtlichkeit bewahren möchte. Laut meiner Erfahrung wird von den Lehrern darauf zu wenig geachtet und auch Varianten abgenommen, welche fast nur globale Variablen zulassen.


"Fehlerhaftes" Programm (ZIP-Download 167kb)

zurück zur Erläuterung des Gesamtkonzeptes
zurück zur Gesamtübersicht