von Harald Schönfeld Anmerkung vorweg: Klammern, die in den Listingauszügen ein Plus davor haben, sind als eckige Klammern (ohne Plus) einzugeben. Zunächst noch ein Wort zum letzten Text: Der SIGN und UNSIGN Befehl hat natürlich nicht nur auf Vergleiche Auswirkungen. Auch der PRINT-Befehl ist davon betroffen und bringt Vorzeichen oder nicht, je nachdem wofür man sich entscheidet. Das war so klar, daß ich es ganz zu erwähnen vergaß... Nachdem wir im letzten Teil BYTE- und WORD- Variablen kennengelernt haben, wollen wir uns nun mit den ARRAY-Vari- ablen auseinandersetzen. ARRAYs Mit Hilfe der ARRAY-Variablen kann man in QUICK sowohl Zahlenfelder als auch Strings verwirklichen. Daran ist wie- dereinmal die Nähe zur Programmier- sprache "C" zu erkennen. Zunächst sehen wir uns an, wie man ARRAYs deklariert: ARRAY +( A(20),B(20) +) Hier werden 2 Variablen (A,B) deklar- iert, die jeweils ein 20 Byte langes Feld belegen sollen. Was wir in dieses Feld hineinschreiben, bleibt uns über- lassen. Es wird nicht wie im BASIC durch "$" angedeutet, ob es sich um ein Zahlenfeld oder eine Stringvariable handelt. Wie andere Variablen auch, können wir ARRAYs an bestimmte Stellen im Speicher legen: ARRAY +( C(20)=36000 +) Damit beginnt das Feld "C" an der A- dresse 36000 im Speicer. Soetwas ist jedoch für den Anfänger weniger zu empfehlen. ARRAY als String: Dies ist die zunächst einfachste Be- nutzungsart für ARRAYs. Man kann ARRAYs direkt Texte zuweisen, die dann vom ersten Byte an, in das Feld geschrieben werden. Ist der Text länger als das Feld, so wird er in diesem Fall abge- schnitten. Am Ende des Textes wird eine NULL angehängt. Diese NULL ist nötig, damit stringverarbeitende Routinen das Ende erkennen können: A="Hallo" wird also folgendermaßen abgelegt: BYTE 0 1 2 3 4 5 6 7 8 9 ... H a l l o NULL NULL ist dabei der Zahlenwert NULL und nicht das Zeichen "0"! Es ist auch möglich ARRAY-Variablen zu kopieren: A="Hallo" B="Ade" A(2)=B Das Ergebnis ist "HaAde" oder A(0)=B bzw. einfacher: A=B Ergebnis: "Ade" Nicht möglich ist aber indizierte Zu- weisung von Texten: A(2)="Ade" falsch!!!! Bei all diesen Kopierfunktionen wird die Dimensionierung nicht mehr über- wacht. Also Vorsicht! Man sollte nicht unkontrolliert Texte kopieren, die dann plötzlich in andere Variablen hinein- reichen. Wie "C" hat auch QUICK intern keine weiteren Befehle zur Stringverarbei- tung. Allerdings gibt es die Library STR.LIB, die eine Vielzahl von Routinen zur Stringbearbeitung besitzt. Unter anderem bietet sie Kopierroutinen, Vergleichsroutinen, Veränderungs- routinen (z.B. "Abc" nach "ABC" oder "abc"), Routinen zur Stringlängener- mittlung, Anhäng- und Abschneide- routinen. Eine genaue Beschreibung der STR.LIB und ihrer 15 Routinen und die Library selbst befinden sich auf der QUICKmagazin Disk 5 vom Verlag W. Rätz. Man muß sich also nicht selbst die Mühe machen alle grundlegenden Funktionen zu schreiben. Ist ein ARRAY mit "Hallo" belegt, so haben die einzelnen BYTEs des ARRAYs die Belegung: B(0)=72 B(1)=97 B(2)=108 B(3)=108 B(4)=111 B(5)=0 Natürlich kann man diese Byteweise Zuweisung auch selbst durchführen. Dann erhält man : ARRAYs als CHR$-Ersatz: Wir weisen dem ersten Byte eines ARRAYs einen bestimmten Wert zu: A(0)=125 Damit haben wir sozusagen "ein Zeichen" in das Feld geschrieben. Wollen wir das Zeichen PRINTEN, so müssen wir jedoch auch die NULL am Ende angeben: A(1)=0 Mit dem Befehl PRINT(A) geben wir nun das Zeichen mit dem Wert 125 aus. Das ist also dasselbe wie PRINT CHR$(125) in BASIC. In beiden Fällen haben wir somit den Bildschirm gelöscht. Die NULL selbst kann so natürlich nicht ausgege- ben werden ! ARRAYs als Zahlenfeld: Natürlich können wir uns auch völlig von der Stringverwandschaft der ARRAYs lösen, und ARRAYs als reine Zahlenfel- der benutzen. Sie bilden damit eindimensionale Zah- lenfelder, die entweder aus bis zu 255 Bytes oder 127 Words aufgebaut sind. Ob ein Feld BYTEs oder WORDs enthält ent- scheidet alleine der Benutzer, in der Deklaration wird genau wie oben nur die Länge in BYTEs angegeben. Die Benutzung als BYTE-Feld ist ganz einfach: Man kann einfach dem entsprechenden Feldelement einen BYTE-Wert zuweisen: A(0)=20 A(1)=255 A(2)=-10 A(3)=$AB Das Vorzeichen wird wie gehabt im 2er- Komplement verwaltet. Etwas aufpassen muß man dagegen bei der Verwendung von ARRAYs für WORD- Variablen: Hier legt man fest, daß alle Werte auf geraden Feldpositionen beginnen sollen, denn jeder Wert belegt ja nun 2 Bytes. Das erste Element belegt somit A(0) und A(1), das zweite A(2) und A(3) usw: A(0)=1234 A(2)=-64321 Aufpassen muß man nun bei der Zuweisung von Werten, die eigentlich nur 1 Byte belegen. Dabei muß man nun nämlich dem Compiler sagen, daß der Wert auf 2 Bytes ausgedehnt werden soll (d.h. das Highbyte muß auf Null gesetzt werden): A(4)=!1 Das Ausrufezeichen erzwingt somit 2 BYTEs und ergibt programmintern die Befehle A(4)=1, A(5)=0. Vergißt man "!", so ist das Highbyte undefiniert, was natürlich leicht zu falschen Ergebnissen aller Art führen kann. Auch hier kann man hexadekadische Zahlen eingeben: A(6)=$FFFF A(8)=-!$F Wie immer in QUICK ist es nicht möglich Funktionen zu schachteln: PRINT(A(0)) falsch!!! Man muß dies in 2 Schritte aufteilen: W=A(0) PRINT(W) Das Kopieren zweier Zahlenfelder sollte man nicht durch "Zuweisungen" erledi- gen: A=B falsch!!! Hier wird B nur bis zum ersten Element, in dem sich eine NULL befindet kopiert. Sollte sich keine NULL im Feld befin- den, darf man sogar damit rechnen, daß man die RESET-Taste bemühen muß... Besser ist es, man macht es mit einer kleinen Schleife, die man natürlich auch gut als Unterprogramm verwirk- lichen kann. Im Vorgriff auf später folgt hier also ein kleines Progrämm- lein: BYTE +( I,W +) ARRAY +( A(20),B(20) +) MAIN B(0)=0 B(1)=1 B(2)=2 I=0 REPEAT W=B(I) A(I)=W I+ UNTIL I=20 ENDMAIN Das Programm schreibt also zunächst ein paar Werte in das B-Feld, das hier also als BYTE-Feld verwendet wird. In der REPEAT-UNTIL-Schleife wird dann B in A kopiert, wobei man jeden Wert in W zwischenspeichern muß, da pro Zeile nur eine indizierte Variable auftauchen darf. Mit I+ wird der Schleifenzähler erhöht, so daß wir nach 20 BYTEs ab- brechen. Das selbe Programm klappt natürlich auch mit WORD-Feldern (die sind ja schließlich auch aus BYTEs aufgebaut). Offensichtlicher ist aber die folgende Version für WORD-ARRAYs: BYTE +( I +) WORD +( W +) ARRAY +( A(20),B(20) +) MAIN B(0)=!0 B(2)=!1 B(4)=!2 I=0 REPEAT W=B(I) A(I)=W I+ I+ UNTIL I=20 ENDMAIN Hier ist W eine WORD-Variable, die den gesamten WORD-Feldwert auf einmal spei- chern kann. Dafür können wir nun I gleich um 2 erhöhen. Es sei angemerkt, daß I+ I+ immer noch schneller als eine "normale" Addition nach dem Schema ADD(I,2,I) ist. Erst ab 3 "+" Befehlen wird die Addition schneller. So, nachdem wir nun also alles über Variablen in QUICK wissen, können wir uns mit dem Programmieren beschäftigen. III Der Hauptprogrammblock --------------------------- Jedes lauffähige QUICKprogramm muß einen HP-Block enthalten. Er beginnt mit MAIN und endet mit ENDMAIN. Zwischen diesen beiden Schlüsselwörtern dürfen alle QUICK-Befehle verwendet werden: MAIN ... Hier steht das HP ENDMAIN Mehr gibt's dazu nicht zu schreiben!!! IV Die Unterprogrammblöcke --------------------------- Jeder HP-Block darf von beliebig vielen UP-Blöcken gefolgt sein. Diese Blöcke haben den folgenden Aufbau: PROC Name Variablendeklaration local/in/out BEGIN ... ENDPROC oder falls es ein Interrupt (!) ist: INTER Name Variablendeklaration local BEGIN ... ENDDLI / ENDVBI Name steht dabei für den Namen des Unterprogramms. Denn jedes Unterpro- gramm wird durch Nennung seines Names aufgerufen. Das ist doch viel schöner als irgendeine Zeilennummer anzusprin- gen... Das Besondere ist der Teil zur Deklara- tion der lokalen Variablen. Was es mit diesen Variablen auf sich hat, wurde ja schon im letzten Teil angedeutet. Und was der Variablendeklarationsteil nun wirklich ist, das sehen wir im nächsten Teil. Ich mach das so spannend wie's nur geht, weil das eine der größten Stärken von QUICK ist. Abgesehen von der hohen Geschwindigkeit natürlich...