QUICK Ecke 20 von Harald Schönfeld Auch in der heutigen Folge geht es wieder um die Frage: Wie kann man BASIC-Programme nach QUICK umschreiben. Schleifen In BASIC gibt es ja nur 2 Schleifen- typen, und zwar FOR/NEXT und GOTO- Schleifen. So sollte es kein Problem sein, diese in QUICK, das ja mehr Möglichkeiten bietet, zu verwirklichen. Grunsätzlich stimmt das auch: FOR/NEXT Schleifen 10 FOR I=0 TO 10 20 ?I 30 NEXT I Ein solcher Block kann problemlos in QUICK geschrieben werden. Allerdings steht KEIN FOR/NEXT-Befehl zur Verfügung. Normalerweise sollte man statt dessen den REPEAT/UNTIL-Befehl verwenden. Die Initialisierung des Schleifenzählers muß dann allerdings manuell geschehen: I=0 REPEAT ?(I) I++ UNTIL I=11 Wie man sieht, muß der Schleifenzähler von Hand hochgezählt werden. Die Abfrage des Schleifenendes muß man sich auch genau überlegen. Bei der FOR/NEXT Schleife des BASIC wird der Endwert 10 angenommen. Da bei der REPEAT/UNTIL Konstruktion der Wert vor der Abfrage erhöht wird, muß man also auf den nächst höheren Wert überprüfen. 10 FOR I=0 TO 10 STEP 2 20 ? I 30 NEXT I Auch eine solche Schleife kann umgesetzt werden, indem man den Schleifenindex von Hand entsprechend jeweils um 2 erhöht. Es ist klar, daß man mit der REPEAT/UNTIL-Schleife noch mehr tun kann, da man völlige Freiheit in Bezug auf die Veränderung des Schelifenzählers hat. GOTO 10 ?"ENDLOS" 20 GOTO 10 Nun, auch in QUICK gibt es einen GOTO-Befehl, den JUMP-Befehl. Da es in QUICK jedoch glücklicherweise keine Zeilennummern gibt, muß man die Sprungziele im Programm durch Labels angeben: -1 ?("ENDLOS") JUMP(1) Die Reihenfolge der Labels ist dabei völlig bedeutungslos. Man sollte nur keine Labels doppelt verwenden und bedenken, daß hohe Nummern für die Bibliotheken reserviert sind. Damit sind wir ja schon beim Ende der ATARI-BASIC Schleifenmöglichkeiten angelangt. Im TURBO-BASIC gibt es dann noch Befehle, die in QUICK sowieso vorhanden sind: REPEAT/UNTIL 10 I=0 20 REPEAT 30 ?I 40 I=I+2 50 UNTIL I>40 Solche Konstrukte können sozusagen direkt in QUICK übernommen werden. WHILE/WEND 10 I=20 20 WHILE I>0 30 ?I 40 I=I-5 50 WEND Auch hier macht QUICK es genauso. Allerdings sollte man sich wie immer überlegen, welche Art von Variable als Zählvariable nötig ist. Vorzeichenloses BYTE, signed oder unsigend WORD oder gar Fließkommazahlen? Schließlich gibt es in TURBO-BASIC noch die folgende Struktur: DO/LOOP 10 DO 20 ?"ENDLOS" 30 LOOP Hier verwendet man in QUICK entweder JUMP oder, was zu empfehlen ist, die folgende Endlosschleife: REPEAT ?("ENDLOS") UNTIL 1=0 Denn JUMPs sollten nur verwendet werden, wo sie nicht zu verhindern sind! Mit all diesen Empfehlungen ist aber nur das grundsätzliche Problem der Schleifenkonstrukte gelöst. Es bleibt aber das wichtige Problem der Vergleiche für das Schleifenende. In BASIC kann jeder Vergleich ein kompexer logischer Term sein, während in QUICK wirklich nur 2 Zahlen miteinander verglichen werden können. ... 50 UNTIL (A>10) OR (B=20) Ein solcher Vergleich, wie er in TURBO BASIC üblich ist, muß in QUICK in seine Einzelteile zerlegt werden. Dabei muß man meist Hilfsvariable benutzen: ... H=0 IF A>10 H=1 ENDIF IF B=20 H=1 ENDIF UNTIL H=1 Dieser Programmteil ist natürlich nicht gerade elegant, erfüllt aber seinen Zwck und dürfte trotzdem wesentlich schneller sein als sein BASIC-Vorbild. In BASIC ist auch sowas möglich: ... 50 UNTIL A*10+B/2 < 10 Auch dies muß in QUICK aufgespalten werden: ... MULT(A,10,H) DIV(B,2,H1) ADD(H,H1,H) UNTIL H<10 Komplizierter wird die Angelegenheit, wenn Fließkommazahlen ins Spiel kommen. Hier muß auf die Routinen der MATHE- Library zurückgegriffen werden, was den Quelltext doch etwas unüberschaubar macht. Deshalb auch hier wieder der Rat: BASIC-Programme, die Fließkommazahlen unbedingt benötigen, sollte man erst gar nicht nach QUICK übersetzen, weil sie sowieso nicht schneller werden. In BASIC ist es auch möglich eine Schleife vorzeitig zu verlassen: 10 FOR I=0 TO 10 20 IF I=5 THEN POP:GOTO 40 30 NEXT I 40 ... Das ist natürlich auch in QUICK möglich. Allerdings ist der POP-Befehl hier nicht nötig: I=0 REPEAT IF I=5 JUMP(1) ENDIF I++ UNTIL I=11 -1 Dazu noch eine Anmerkung: Während es der POP-Befehl in TURBO-BASIC auch ermöglicht, Unterprogramme zu beenden, ohne durch das ENDPROC bzw. RETURN zu laufen, ist das in QUICK nicht möglich. Jedes Unterprogramm in QUICK muß korrekt beendet werden, wenn nötig muß man eben einen Sprung zum Ende des Unterprogramms machen. Ein JUMP aus einem Unterprogramm zurück in den aufrufenden Programmteil kann schlimme Folgen haben.