Ein Case für alle Fälle - Case Of Struktur in OMIKRON. Basic

Eigene Prozeduren oder Funktionen sind in Basic kein Problem; aber, daß man auch völlig neue Strukturen einbauen kann, ist nicht vorgesehen. Das folgende Beispiel zeigt, daß es trotzdem geht.

Pascal bietet die Struktur CASE OF. Das ärgerte natürlich die fortschrittlichen Basic-Programmierer schon lange. Das Resultat: es geht doch. Das Prinzip ist relativ einfach. Zuerst erfolgt ein Befehl Case (Variable). Dahinter verbirgt sich nichts anderes als eine Prozedur namens Case. Der Ausdruck in Klammern ist der Übergabeparameter. Dieser wird innerhalb des Unterprogrammes einer bestimmten Variablen zugeordnet, die später noch Verwendung findet. Dann folgt die Anweisung ’Of(Wert)’, welche prüft, ob die Variable hinter ’Case’, mit diesem Wert übereinstimmt. Ist dies der Fall, wird die folgende Programmzeile ausgduhrt. Ist dies nicht der Fall, so wird sie übersprungen und in der übernächste Zeile fortgefahren. Auch ’Of’ ist eine Prozedur. Ihre Aufgabe besteht in nichts anderem, als den Parameter hinter OF mit dem hinter Case zu vergleichen. Dementsprechend wird ein Flag gesetzt oder gelöscht.

Der Witz der Sache kommt mit der Anweisung ’Do’. ’Do’ ist nämlich keine Prozedur, sie darf es auch nicht geben. So löst der Interpreter beim Bearbeiten dieser Anweisung eine Fehlermeldung aus, und zwar Fehler Nummer 8. Das ist nun die Lösung. In der Fehlerroutine, initialisiert mit ON ERROR GOTO, wird die Fehlernummer identifiziert und, je nachdem ob das gerade erwähnte Flag gesetzt oder gelöscht ist, das Programm bei der nächsten oder übernächsten Zeile fortgesetzt.

Dadurch entsteht leider zwangsweise eine Einschränkung: Nach einem DO darf nur eine Zeile folgen; plagt einen aber trotzdem das Verlangen nach mehreren, so gibt man einfach in der folgenden Zeile ein weitere DO ein und darunter die zweite Befehlszeile, usw.

Die neue Struktur wurde also durch Einschleusung eines absichtlichen Fehlers geschaffen. Dies mag zwar seltsam klingen, doch geschieht das gerade beim ST sehr häufig. Man denke nur an die LINE A Traps, wobei der Prozessor auch durch ungültige Befehle in eine Fehlerroutine gelangt, wo er den Fehler analysiert und dementsprechend ein Unterprogramm ausführt. Die Idee ist also gar nicht so neu, aber wirkungsvoll ist sie dennoch.

Die Syntax

Case (Variable)
    Of (Wert1):Do 
        Anweisungszeile 1
    Of (Wert2):Do
        Anweisungszeile2
        Do
        Anweisungszeile2a
    Of (Wert3):Do
        Anweisungszeile3
'End Case
' CASE-Struktur - selbstdefiniert ln OMIKRON.BASIC
'
' Zur Verwendung von Case-Strukturen bitte In's eigene Programm einbauen 1
' - Prozedur Case
' Prozedur Of
' KEINESFALLS eine Prozedur mit dem Namen "Do" definieren!
' - ON ERROR GOTO Fehler
' - die 8 Zellen von Label -Fehler bis zum zweiten ENDIF
' - bitte darauf achten, daß die Zeilennummern aufeinanderfolgen (also nicht 10,20,30..., sondern 1,2,3...) 
' - am besten Zeilennummern
' Im Editor abschalten, OMIKRON.BASIC macht dann automatisch
' Einser-Abstände.
' 
' Funktionsweise
' In der Prozedur "Case" wird lediglich der Stringausdruck zwischen-
' gespeichert. Bei "Of" wird er mit dem bei "Of" angegebenen String-
' ausdruck verglichen. Sind beide gleich, so wird das Flag "CaseFlag"
' auf TRUE gesetzt, sonst auf FALSE.
' Jetzt kommt der Trick: Die Prozedur "Do" existiert nicht! 
' Also entsteht, wenn man sie aufruft, ein Fehler (Undefined Statement, 
' Fehler Nr. 8). In der Fehler-Routine, die dank ON ERROR GOTO nun
' durchlaufen wird, wird das Case Flag abgetestet: bei TRUE
' geht's ln der nächsten Zelle weiter (RESUME NEXT), sonst in der über-
' nächsten (RESUME ERL+2).

' Belsplelprogramm

True=-1:False=0
ON ERROR GOTO Fehler
INPUT "Schwierigkeitsgrad (leicht,mittel,schwer) : ";Schwierigkeitsgrad$
Case( UPPER$( LEFT$(Schwierigkeitsgrad$,1)))
    Of("L"):Do
        PRINT "Nun, einfach fängt man an!"
    Of("M"):Do
        PRINT "Wer's weiters wagt, gewinnt auch mehr!"
    Of("S"):Do
        PRINT "Den feuerspein'den Drachen fürcht' der Recke nicht!"

' Ende der Case-Struktur. Der Rest bis END ist nicht notwendig.
PRINT : PRINT "Suche Ihr drückendes Gefängnis und befreie die”
PRINT " Prinzessin aus der unverdienten Gefangenschaft 1”
WAIT 3
REPEAT
    PRINT
    PRINT "Du bist in einer feuchten, dunklen Höhle."
    IF RND(3)=1 THEN PRINT "Wasser tropft von der Decke und sammelt sich in
        kleinen Lachen auf dem Boden.”
    PRINT "Richtungen: N,S,O,W"
    INPUT "Was willst du tun: ”;Kommando$
UNTIL Player_Is_Mad
END

DEF PROC Case(V$)
Case Vergleich$=V$
RETURN

DEF PROC Of(V$)
IF Case_Verglelch$=V$ THEN Case_Flag=True ELSE CaseFlag=False
RETURN

-Fehler
IF ERR=8 THEN ' Fehler 8="Undefined Statement". Prozedur "Do" Ist Undefiniert
    IF Case Flag
        THEN RESUME NEXT
        ELSE RESUME ERL +2
    ENDIF
ELSE STOP
ENDIF

Case Of Struktur mit Beispiel



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]