Hier hätten wir das 3. Datenelement des 523. Hauptelements von A$ ausgedruckt, dies kann man in beliebig vielen Dimen- sionen weiterführen, soweit diese sinn- voll sind. Eines sollte ich jedoch noch sagen: bei einer Dimensionierung von Variablen reserviert der C64 für jede einzelne Variable einen bestimmten Spei- cherbereich. Bei FLOAT-Variablen ist dies besonders Speicherintensiv. Pro Variable gehen nämlich 5 Bytes flöten, die nicht mehr für andere Variablen be- nutzt werden können. Hierbei ist es übrigens egal, ob diese Variable nun einen Inhalt hat oder nicht. Man muß sich also immer ausrechnen, wieviel Speicherplatz so ein Feld einnimmt, um nicht in Speichermangel zu kommen, denn dann bricht der 64er unweigerlich mit einem "?OUT OF MEMORY ERROR" ab. Woll- ten Sie beispiel ein 6-dimensionales Feld mit jeweils 4 Datenelementen dimen- sionieren, so könnten Sie mit dem Spei- cherplatz knapp werden:
DIM A(3,3,3,3,3,3)
Wenn Sie sich wundern, warum hier immer 3 anstatt 4 steht, wie ich ja eben sag- te, so denken Sie bitte daran, daß das 0. Datenelement ebenfalls mitzählt, also 0,1,2,3 = vier Elemente. Oben bei A$ hätte ich auch schreiben sollen, daß wir dort anstatt 1000 sogar 1001 Elemente, mit 11 anstatt 10 Unterelementen dimen- sioniert haben, doch habe ich dies zum besseren Verständnis zu jenem Zeitpunkt weggelassen. Wir hätten hier also 4*4*4*4*4*4=4↑6 Variablen dimensioniert, für die alle 5 Bytes Speicherplatz reserviert werden, also 4↑6*5 Bytes oder 4096*5 Bytes = 20480 Bytes, das entspricht etwa 2/3 des gesamten Basicspeichers (38911 Bytes). Es ist also keineswegs egal, wieviele Elemente Sie dimensionieren. Suchen Sie ein Optimum heraus. Bei String- und In- tegervariablen ist der Speicherplatzver- brauch etwas geringer. Probieren Sie doch einfach einmal aus, wie viel Platz Sie haben. Kommen wir nun noch zu drei weiteren kleinen Befehlen, die ich ihnen noch erklären muß. Da wäre zunächst einmal der DEF FN-Befehl. Dies ist eigentlich nichts weiter als eine kleine Program- mierhilfe, die man zwar nicht unbedingt braucht, die jedoch ganz nützlich sein kann, wenn man strukturiert programmie- ren möchte. FN ist quasi ein Varia- blenkürzel für eine vorher definierte Funktion. Sie müssen an dieses Kürzel nur noch einen FLOAT-Variablennamen anhängen (also einen Variablennamen OHNE "%" oder "$"). Auf diese Weise können Sie häufig benutzte Funktionen, zum Bei- spiel komplexere Rechenformeln vordefi- nieren, die Sie dann durch einen simplen und kurzen Aufruf komplett durchrechenen können. Dies ist rechenzeit- und spei- cherplatzsparend. Doch hier die Praxis. Zunächst wollen wir erst einmal eine Funktion vordefi- nieren, hierzu benutzt man das DEF- Statement:
DEF FNAX(X)=(10/X)*SIN(X)+201
Hier haben wir der FunktioN AX die For- mel (10/X)*SIN(X)+201 zugeordnet. Das "X" in Klammern der Definition muß immer mit angehängt werden. Möchten Sie nun einmal das Ergebnis der Formel ausge- druckt haben, wenn Sie für X beispiels- weise den Wert 7 einsetzen, so müssen Sie dies folgendermaßen tun: PRINT FNAX(7) Schon erhalten Sie ein Ergebnis. Die Möglichkeit eine Funktion zu definieren eignet sich gut für Kurvendiskussions- programme, da Sie bei einer Funktionsbe- rechnung natürlich auch Variablen ver- wenden können. So zum Beispiel die Lauf- variable einer Schleife, die eine Werte- tabelle ausdruckt. Als Nächstes hätten wir da den WAIT Be- fehl. Mit ihm können wir den 64er darauf warten lassen, daß eine Speicherzelle einen anderen Wert annimmt. Als Beispiel nehme ich hierzu einmal die Speicherzel- le 198, aus dem oben schon genannten Speicherbereich für interne Aufgaben unseres Computers. In dieser Spicherzel- le wird nämlich vom Betriebssystem zwi- schengespeichert, wieviele Tasten schon vom Benutzer gedrückt wurden, ohne daß das dazugehörige Zeichen ausgedruckt wurde. Wenn Sie sich im Direktmodus be- finden steht hier nie mehr als der Wert 1 drin, da der 64er die Tastendrücke schneller druckt, als Sie sie tippen können. Doch während eines laufenden Programms kann diese Zahl auch schon einmal bis zu 10 ansteigen. Deshalb wol- len wir vor der Abfrage dieser Speicher- zelle besser eine 0 hineinPOKEn. Ich möchte Ihnen nämlich nun zeigen, wie man ganz einfach ein Programm zum An- halten bringt, so, daß es auf einen Tastendruck wartet. Hier ein Beispiel:
10 POKE 198,0:WAIT 198,1:POKE 198,0
Hier löschen wir zuerst einmal jeglichen Inhalt der eben genannten Speicherzelle, um sicherzugehen, daß hier auch wirklich nichts drinsteht. Mit dem folgenden WAIT-Befehl warten wir auf das Ereignis, daß eine Taste gedrückt wird, daß also eine 1 vom Betriebssystem in die Spei- cherzelle 198 geschrieben wird. Ist dies der Fall, so fährt der 64er mit dem Pro- gramm fort, wo wir dann gleich noch ein- mal die Zelle 198 löschen, damit das eben eingegebene Zeichen nicht doch noch einmal irgendwann eingelesen werden kann und irgendwelche, nicht gewollte, Funk- tionen im Programm verursacht. Als drittes noch kurz der SYS-Befehl. Dieser Befehl ist für BASIC-Programmier eigentlich wenig wichtig. Mit ihm kann man den 64er dazu veranlassen die BASIC- Ebene zu verlassen und ein Maschinenpro- gramm an einer bestimmten Speicheradres- se auszuführen. Der Befehl "SYS 49152" zum Beispiel, startet ein Assemblerpro- gramm, das in Speicherzelle 49152 be- ginnt. Wenn Sie übrigens mehr über As- sembler bzw. Maschinensprache wissen möchten, so möchte ich an dieser Stelle darauf hinweisen, daß wir, die Redaktion der MAGIC DISK 64, planen, etwa Anfang nächsten Jahres einen Assemblerkurs auf einer eigenen Diskette quasi als Sonder- ausgabe, herauszubringen. Wenn es so- weit sein wird, werden wir Sie dann auch auf jeden Fall noch rechtzeitig infor- mieren. Der Kurs wird übrigens ebenfalls von mir sein, falls Sie also meine Er- klärungen für einsichtlich und einfach halten, so wird diese Diskette ein Muß für alle angehenden Assemblerprogrammie- rer unter Ihnen sein. Der letzte Teil des Basickurses sollte dies sein. Aber das Basic V2.0 beinhal- tet noch ein paar weitere Befehle. Diese sind besonders bei der Programmierung der Grafik wichtig, weswegen sie eigent- lich im sich anschließenden Grafikkurs abgehandelt werden sollten. Da aber zu befürchten ist, daß die ei- gentliche Beschreibung und Erklärung dieser Befehle im Rahmen eines Grafik- kurses zu kurz gerät, haben wir uns ent- schlossen, diese letzten Befehle in einem weiteren, nun aber endgültig letz- ten Basickursteil abzuhandeln. Diesen neunten Teil finden Sie in der Oktoberausgabe der Magic Disk. Im November werden wir dann aber voll in die Grafikprogrammierung einsteigen.
Ihr Uli Basters