^1 The Real Adok's Way to QBASIC ^1 A new Method Step by Step Willkommen zum vierten Teil von The Real Adok's Way to QBASIC! Diesmal wollen wir uns mit den Debugging-M”glichkeiten von Quick Basic und Power Basic besch„ftigen. Eigentlich h„tte dieser Teil schon viel frher kommen mssen, denn beim L”sen der Hausaufgaben k”nnen ”fters Fehler auftreten, die man beheben muá. Aber egal, here we go! Wer noch nie einen kleinen Programmfehler produziert hat, der werfe mit dem ersten Stein! Na, das wird aber lange dauern, bis der erste Stein geworfen wird! Beginnen wir also, indem wir selbst einen Fehler produzieren. Gebt folgende Programmzeile ein: ^0LINE (100, 100) - (150, ) Den Befehl LINE werden wir brigens im Kapitel ber die Grafikprogrammierung noch n„her kennenlernen. Es sei jetzt nur gesagt, daá man mit ihm im Grafik- modus Linien zeichnen kann. Wenn wir jetzt zur Best„tigung ENTER bet„tigen, meldet QBasic einen Fehler (Erwartet: Ausdruck). Wir haben nun zwei M”glichkeiten. Zum einen k”nnen wir uns eine wenig aufschluáreiche Fehlererkl„rung ansehen, die jedoch zu kaum etwas nutze ist, weil es x M”glichkeiten gibt, dieselbe Fehlermeldung zu produzieren. Die andere M”glichkeit ist, in den Editor zurckzukehren, um dort den Fehler zu suchen und zu korrigieren. Wir w„hlen jetzt diese M”glichkeit. Da der Fehler w„hrend der Eingabe auftauchte, kann man daraus schlieáen, daá er sich in der gerade eingegebenen Programmzeile befinden muá. (Auáerdem wird die Stelle, in der sich der Fehler befindet, ohnehin farblich hervorgehoben!) Die Kunst des Fehlerbehebens besteht nun darin, sich die Programmzeile noch einmal genau durchzulesen und bei den Befehlen und den Parametern zu prfen, ob man sich an alle Regeln hielt. Ihr kennt den Befehl LINE noch nicht und k”nnt daher auch nicht den Fehler feststellen. Deshalb verrate ich euch, was da falsch ist: Eine Zahl fehlt. Also schreibt zwischen den letzten Beistrich und die Klammer die Zahl '200'. So, das war die eine M”glichkeit, wo Fehler auftreten k”nnen: bei der Programmeingabe. Glcklicherweise berprfen QBasic und Quick Basic immer die aktuelle Zeile auf Eingabefehler, sobald man ENTER drckt, wodurch sich diese schneller feststellen lassen. Power Basic stellt diese Eingabefehler jedoch erst dann fest, nachdem man den Befehl zur Ausfhrung des Programms erteilte. Von den logischen Fehlern einmal abgesehen, die keine Programmiersprache fest- stellen kann und auf die wir sp„ter zu sprechen kommen, sind Eingabefehler die h„ufigsten Fehler. Doch es k”nnen auch Laufzeitfehler, sprich Fehler w„hrend der Ausfhrung eines Programms, entstehen. QBasic-Benutzer sind hier besonders im Nachteil, weil QBasic nur ein Interpreter ist und im Gegensatz zu den Compilern einige Fehler erst w„hrend der Ausfhrung des jeweiligen Befehls entdeckt werden k”nnen. Eine h„ufige Art von Laufzeitfehlern entsteht, wenn man Grafikbefehle benutzt, ohne vorher in den Grafikmodus umgeschaltet zu haben (wozu der Grafikmodus dient, werden wir sp„ter erfahren). Dies ist brigens auch bei unserem Einzeiler-Programm so. Also starten wir es, um diesen Laufzeitfehler zu produzieren. Wir erkennen, daá Laufzeitfehler im Grunde genommen genauso wie Eingabefehler behandelt werden, nur mit dem Unterschied, daá sich der Fehler nicht in der aktuellen Zeile befinden muá. Hier ben”tigen wir also etwas Logik, um heraus- zufinden, was nun falsch sei. Bei unserem Beispiel habe ich es ja schon verraten: Wir vergaáen, vorher in den Grafikmodus umzuschalten. Dies k”nnen wir korrigieren, indem wir eine Zeile vor den LINE-Befehl einfgen und dort ^0SCREEN 12 schreiben. Jetzt sieht das Programm folgendermaáen aus: ^0SCREEN 12 ^0LINE (100, 100) - (150, 200) Wenn wir es nun starten, erscheint eine nette, kleine Gerade auf dem Bild- schirm. Hurra! Wir haben es geschafft! Die h„ufigste Fehlerart sind aber logische Fehler. Dies sind die aus vielen professionellen Anwendungen bekannten Bugs, wegen denen das Programm nicht immer tut, was der Benutzer will! Da bei diesen Fehlern die Befehle meist richtig geschrieben und den Regeln entsprechend angewendet werden, kann QBasic sie nicht finden. Abhilfe schaffen nur sorgf„ltiges Planen vor der eigent- lichen Codierung und strukturiertes Programmieren (siehe PCH 2/96!) QBasic versucht aber, den Programmierer so weit wie m”glich bei der Suche nach logischen Fehlern in seinen Programmen zu untersttzen. Dazu gibt's die M”glichkeit, mit F9 Haltepunkte einzufgen. Wenn das Programm nun mit F5 gestartet wird, wird es nur bis zu der Zeile, in der der Haltepunkt gesetzt ist, ausgefhrt. Danach kehrt QBasic in den Editor zurck, wo man nun kleine Žnderungen und Fehlerkorrekturen durchfhren kann. Durch einen erneuten Druck auf F5 wird die Programmausfhrung von diesem Haltepunkt an bis zum n„chsten fortgesetzt, w„hrend mit Shift und F5 gleichzeitig das Programm von Anfang an neu gestartet wird. Diese Haltepunkte sind besonders ntzlich in Kombination mit den erweiterten Debugging-Funktionen von Quick Basic und Power Basic. Dort kann man n„mlich im Men Debug (QB) bzw. Debug - Watch (PB) die jeweils aktuellen Inhalte von Variablen st„ndig auf dem Bildschirm des Editors anzeigen. In Quick Basic heiát die Menoption, die ihr w„hlen mát, 'Variable anzeigen', in Power Basic 'Add Watch'. Danach mát ihr den Namen der Variablen angeben, deren aktueller Wert st„ndig angezeigt werden soll. Schon erscheinen der Name der Variablen und der aktuelle Wert auf dem Bildschirm! Jetzt k”nnt ihr entweder das Programm starten oder mit dem Editieren fortfahren. Mit den anderen Befehlen im angegebenen Men lassen sich diese angezeigten Variablen wieder vom Bildschirm l”schen. Die Variablen selbst werden dabei nicht aus dem Speicher gel”scht!!! Ntzlich ist auch die Funktion 'Aktueller Wert anzeigen' von Quick Basic (in Power Basic máte es dazu auch ein Žquivalent geben; wie es heiát, weiá ich aber momentan nicht), die den aktuellen Wert der Variablen anzeigt, auf der sich der Cursor befindet. Mit einem Mausklick l„át sich diese Variable dann in die Liste der anzuzeigenden Variablen aufnehmen. So, das w„re alles, was ber die Debugging-Funktionen zu sagen w„re. Da dieser Teil des Kurses sehr kurz geworden ist und ich fr n„chstes Mal sehr viel vorhabe, werde ich einen Befehl, den ich ursprnglich erst im n„chsten Teil erkl„ren wollte, schon hier besprechen. Es ist ein Befehl, der etwas aus der Reihe f„llt. Auáerdem ist er unser erster Block-Befehl, was heiáen soll, daá er eigentlich aus zwei Befehlen besteht. Bei dem Befehl handelt es sich konkret - tatatata - um DO/LOOP. Wir haben ihn schon frher einmal in einem Beispielprogramm kennengelernt. Er ist brigens einer der vielseitigsten Befehle, die es gibt (diesmal auf ALLE Programmiersprachen bezogen). Als "nackter" Befehl ohne Parameter, bedeutet er, daá der Programmteil zwischen den beiden Schlsselw”rtern DO und LOOP unendlich oft wiederholt wird. Man nennt dies eine Endlosschleife. Solche Endlosschleifen sind nicht besonders ratsam, weil man sie nur durch gleich- zeitiges Drcken von STRG und PAUSE abbrechen kann - wenn berhaupt. Aber keine Angst, bei QBasic funktioniert es (fast) immer! Bei Power Basic ist das wieder etwas anderes, weil dieses keine Programme in der Vorgangsweise eines Interpreters bersetzen kann, sondern nur wie ein Compiler. Compiler sind meistens sowieso besser, aber das ist ein anderes Thema. Unser kleines Experiment, das jetzt folgen wird, máte auch in Power Basic kein Problem sein: ^0'Endlosschleife, kann nur mit STRG und PAUSE abgebrochen werden! ^0COLOR 14, 9 ^0CLS ^0DO 'Anfang der Schleife. ^0 PRINT "Hallo, Leute!" ^0 PRINT "Hi, Hugendubelexpress!" ^0 PRINT "Viele Gráe von QBASIC!" ^0 Stopper = TIMER 'Kleine Stoppschleife, weil das Ganze ^0 DO 'sonst zu schnell wird. ^0 LOOP UNTIL TIMER > Stopper + .5 ^0LOOP 'Ende der Schleife. So, nehmen wir dieses zw”lfzeilige Proggy genauer unter die Lupe. 'Schleife' ist brigens eine Bezeichnung fr eine spezielle Art von Bl”cken, zu denen auch DO/LOOP geh”rt. In der dritten Zeile wird die Farbkombination gew„hlt, in der vierten der Bildschirm gel”scht. Die fnfte Zeile beinhaltet jetzt den neuen Befehl: DO. Er setzt den Beginn der Schleife. Die Zeilen 6 bis 11 beinhalten den eigentlichen Code, der unendlich oft ausgefhrt wird. Ich habe diese Zeilen zugunsten der šbersicht eingerckt. Man sollte sich angew”hnen, bei Bl”cken immer den eigentlichen Code zwischen Blockanfang und Blockende einzurcken, weil es sonst sehr schnell unbersichtlich wird. In der Schleife befindet sich auáerdem eine weitere Schleife, die eine markante Eigenschaft von Bl”cken aufweist: Sie lassen sich ineinander ver- schachteln. Das innerste LOOP geh”rt zum innersten DO, das zweitinnerste LOOP zum zweitinnersten DO usw. bis zum „uáersten LOOP, das zum „uáersten DO geh”rt. Theoretisch kann man Bl”cke unendlich oft verschachteln! Hier haben wir allerdings nur zwei "Ebenen" verwendet. Das innere LOOP geh”rt zum inneren DO, das „uáere LOOP zum „uáeren DO. Was UNTIL und TIMER bedeuten, braucht ihr noch nicht zu wissen (UNTIL wird schon bald erkl„rt), jedenfalls sei gesagt, daá die innere Schleife dazu dient, zwischen den einzelnen Textausgaben eine kleine Pause zu machen. Das LOOP in Zeile 12 schlieálich veranlaát QBasic, zurck in die Zeile 5 mit DO zu springen. Da dort keine Abbruchsbedingungen zu finden sind, wird der Code innerhalb der Schleife wiederholt ausgefhrt. Dann kommt QBasic wieder zu LOOP, springt nach DO, fhrt den Code innerhalb der Schleife aus usw. Was hat es nun mit diesem UNTIL auf sich? Die Schlsselw”rter UNTIL und WHILE k”nnen nach DO oder LOOP stehen und geben eine Abbruchsbedingung an. Wenn bei UNTIL diese erfllt ist, wird die DO/LOOP-Schleife abgebrochen und der n„chste Befehl nach LOOP ausgefhrt. Bei WHILE ist das Ganze umgekehrt: Wenn die Bedingung NICHT erfllt ist, wird die Schleife abgebrochen, ansonsten wird die Ausfhrung fortgesetzt. Da ein Beispiel mehr sagt als tausend Worte, hier eine kleine Anwendung fr UNTIL. Sie z„hlt von 0 bis auf 10 hinauf und gibt dabei die Zahl und einen Text aus. Mittlerweile sind wir brigens schon bei unserem zehnten Beispielprogramm angelangt. JUBILŽUM!!!! ^0'Z„hlschleife ^0COLOR 14, 1 ^0CLS ^0Zaehler = 0 ^0DO ^0 PRINT "Schleife wird zum"; Zaehler; ". Mal durchlaufen." ^0 Zaehler = Zaehler + 1 ^0LOOP UNTIL Zaehler = 10 ^0PRINT "Wert des Schleifenz„hlers ist"; Zaehler; "=> PROGRAMMABBRUCH." Das Interessante beginnt ab Zeile 6. Dort wird der Schleifenz„hler auf 0 gesetzt. Eigentlich unwichtig, weil alle Zahlenvariablen vor einer Zuweisung 0 enthalten, doch zur šbersichtlichkeit machen wir es hier. Danach wird mit DO der Schleifenkopf eingeleitet. Hier ist nichts Neues dazugekommen. In der achten Zeile wird nun ausgegeben, zum wievielten Mal die Schleife durchlaufen wird. Eigentlich ist das etwas unlogisch, weil beim ersten Schleifendurchlauf ausge- geben wird, daá die Schleife zum nullten Mal durchlaufen wird! Aber das k”nnt ihr ja selbst SEHR einfach auf zwei Arten „ndern. Wie, das m”chte ich nicht verraten. Macht es doch als Hausbung! In der neunten Zeile wird der Schleifenz„hler um 1 erh”ht. Und jetzt kommt's! In der zehnten Zeile wird noch zus„tzlich neben LOOP das Schlsselwort UNTIL verwendet. 'Zaehler = 10' ist nun so ein Vergleich, wie wir in der n„chsten Folge beim IF/THEN/ELSE/ENDIF-Block viele kennenlernen werden. Dieser hier fragt ab, ob der Inhalt der Variablen Zaehler gleich 10 ist. Wenn ja, dann wird die Schleife abgebrochen und die PRINT-Anweisung, die sich in der elften Zeile befindet, ausgefhrt. Ansonsten wird das Ganze nach DO verzweigt, und die Schleife wird erneut ausgefhrt. Diesmal ist jedoch die Variable Zaehler schon um 1 gr”áer als beim letzten Durchlauf. Nun wird ausgegeben, daá die Schleife das erste Mal durchlaufen werde (f„lschlicherweise, wie wir wissen) und das Ganze geht weiter, bis der Z„hler auf 10 erh”ht wird. Dann wird die Schleife abgebrochen, und wir kommen zur abschlieáenden Textausgabe. ^1Diese Art der Z„hlschleife ist schon etwas aufwendig. N„chstes Mal werden wir ^1die auf Z„hlaufgaben spezialisierte FOR/NEXT-Schleife kennenlernen. Auáerdem ^1werden wir mit dem IF/THEN/ELSE/ENDIF-Block unsere Variablen auf bestimmte ^1Inhalte berprfen. Mit diesen Kenntnissen k”nnten wir dann schon ein ein- ^1faches Adventure-Spiel erstellen, das wir in Teil 6 besprechen werden. ^1Interessiert? Dann besorgt euch den n„chsten Hugi! Zum Abschluá noch einmal die Z„hlschleife, diesmal mit WHILE (viel komplizier- ter): ^0'Z„hlschleife, Version mit WHILE ^0COLOR 14, 1 ^0CLS ^0Zaehler = 0 ^0DO ^0 PRINT "Schleife wird zum"; Zaehler; ". Mal durchlaufen." ^0 Zaehler = Zaehler + 1 ^0LOOP WHILE Zaehler < 10 ^0PRINT "Wert des Schleifenz„hlers ist"; Zaehler; "=> PROGRAMMABBRUCH." ^1Und nicht vergessen: Sch”n brav mit den erlernten Befehlen experimentieren und ^1immer die Hausaufgaben erledigen! Wir sehen einander im n„chsten Teil von The ^1Real Adok's Way to QBASIC. ^4 Euer The Real Adok.