★ APPLICATIONS ★ PROGRAMMATION ★ ARRAYS VARIABEL DIMENSIONIERT (HAPPY COMPUTER) ★ |
Arrays variabel dimensioniert (Happy Computer) | Applications Programmation |
Oft ist zu Beginn eines Programms nicht bekannt, wieviel Elemente ein Feld maximal benötigt. Mit einer im Programmlauf veränderbaren Dimensionierung des Feldes, kann das Problem elegant und effektiv gelöst werden. Wenn man sich als Entwickler Gedanken um die Struktur eines neuen Programms macht, ist ein wesentlicher Punkt dabei die Dimensionierung der Felder (Arrays). Steht die Zahl der Elemente von vorneherein fest, gibt es kein Problem. Meistens allerdings ist das nicht der Fall. Bei einer Textverarbeitung braucht beispielsweise ein kurzer Zweizeiler weniger Speicherplatz als ein Referat oder ein Aufsatz. Ähnliches gilt für die Anzahl von Datensätzen in einem Dateiverwaltungsprogramm oder für die Anzahl von Reihen in einer Tabellenkalkulation. ln vielen Fällen macht es sich der Programmierer (zugegeben zwangsweise) recht einfach. Er schätz grob über den Daumen die maximal benötigte Größe ab und dimensioniert die Felder dementsprechend. Damit können dann aber auch nur Daten bis zu dem festgelegten Umfang aufgenommen Werdern. Sind mehr Werte zu verarbeiten. so »steigt« das Programm aus. Kein Problem, werden Sie vielleicht sagen, soll er doch einfach das oder die Felder so groß machen. daß diese beim besten Willen nicht vollzukriegen sind. Das hat aber einen entscheidenden Nachteil: Schon mit der Dimensionierung wird Platz im Speicher reserviert. Dieser Platz steht, unabhängig ob er nun benötigt wird oder nicht, für andere Zwecke nicht mehr zur Verfügung. Bei der Dimensionierung von Stringarrays ist es sogar so. daß in dem reservierten Platz nicht die Strings selbst, sondern lediglich die Stringdescriptoren (das sind Länge und Anfangsadresse eines jeden Strings. Platzbedarf drei Byte je String) gespeichert werden. Im Extremfall kann dies dazu führen, daß in einem Programm ein Stringarray mit 14000 Elementen definiert v/ird. dann aber kein Platz mehr für die Strings selbst vorhanden ist. Da der freie Spreicherplatz im Schneider mit etwa 42 KByte zwar nicht knapp, aber auch keineswegs beliebig groß bemessen ist, muß man sich immer für einen Mittelweg zwischen großzügiger und zu geringer Dimensionierung entscheiden. Wertvoller Wünschenswert ist also, das Feld zu Beginn klein zu dimensionieren und dann bei Bedarf Schritt für Schritt zu vergrößern. Der große Vorteil ist, daß auf diese Weise immer nur der gerade benötigte Speicherplatz belegt wird. Das Basic hilft uns direkt nicht weiter. Ein einmal festgelegtes Feld (DIM-Feld) kann nicht mehr verändert werden. Mit ERASE steht allerdings ein natürlicher Befehl zur Verfügung, da man mit ihm Variablen beziehungsweise Felder löschen kann. Den dadurch freiwerdenden Speicherplatz hat man natürlich wieder zur Verfügung. Mit Hilfe einer kleinen Basic- und einer Assembler-Routine kann man eine dynamische Verwaltung eindimensionaler Felder realisieren. Dabei v/ird zunächst ein zweites Feld mit der gleichen Größe wie das zu erweiternde errichtet. In dieses Hilfsfeld schreibt man alle Werte des ersten Felds. Dann wird dieses gelöscht und gleich darauf mit einer größeren Dimensionierung wieder eröffnet. Die Werte aus dem Hilfsfeld werden zurückgeschrieben und das Hilfsfeld gelöscht. Jetzt steht das erweiterte Feld zur Verfügung. Das übrige Programm merkt von dieser Änderung nichts, da der Name gleich bleibt. Da das Hin- und Herkopieren der einzelnen Elemente recht zeitaufwendig ist. übernimmt dies die Assemblenoutme. Assembler sorgt für Geschwindigkeit Wie kann man im Programm nun feststellen, wann der Aufruf dieser Routine fällig ist? Dazu bieten sich zwei Wege an. Da man auf jeden Fall eine Variable braucht, die den Wert der Dimension des Feldes enthält, bietet es sich an. bei jeder Inkrementierung des Pointers, der auf das Feld zeigt, diesen Pointer mit der Dimension zu vergleichen. Ist der Wert größer. das heißt wird auf ein Element gezeigt (daher der Name Jtainter), welches noch gar nicht existiert, dann muß die Routine aufgerufen werden. Als zweites kann man den Befehl ON ERROR GOTO benutzen. Dies empfiehlt sich dann, wenn der Pointer an sehr vielen Stellen im Programm benutzt wird und eine zusätzliche Abfrage an jeder dieser Stellen zu zeitintensiv ist. Beim Zugriff auf ein nicht vorhandenes Element gibt der Interpreter die Fehlermeldung Nummer 9 »Subscript out of ränge« aus. Wurde zu Beginn des Programms ein »ON ERROR GOTO« gesetzt, so ruft der Interpreter die angegebene Routine auf und übergibt in den Variablen ERR und ERL die Fehlemummer (ERR) sowie die Nummer der Zeile (ERL), in welcher der Fehler aufgetreten ist. In dieser Routine muß nun abgefragt werden, ob der Pointer größer als die Dimensionierung des Feldes ist. Will man ganz sicher gehen, kann man die Zeilennummer (ERL) abfragen. Bei mehreren Feldern, die variabel sind, müssen diese Abfragen entsprechend mehrmals gemacht werden. Mit RESUME kann das Hauptprogramm fortgesetzt werden. Das Beispiel aus Listing 1 kann auf die hier gezeigte Art in jedes Basic-Programm integriert werden. Es sorgt dann dafür, daß das Feld »feldS« immer ausreichend dimensioniert ist. Werden folgende Zeilen ergänzt: 351 GOTO 340 |
|
|