DIM

Aus C64-Wiki
Wechseln zu: Navigation, Suche
DIM
Format: DIM <Variable>[(<Index-Zahl>[,<Index-Zahl>...])][,<Variable>[(<Index-Zahl>[,<Index-Zahl>...])]...]
Parameter
<Variable>: Name der definierten Variable
<Index-Zahl>: Höchster Indexwert innerhalb der Dimension
Einordnung
Typ: Anweisung
Kontext: Variablen
Aufgabe: Deklaration von Variablen und Festlegen von (mehrdimensionalen) Feldern
Abkürzung: dI
Verwandte Befehle
CLR

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl DIM unter BASIC V2 des Commodore 64.


Der BASIC-Befehl DIM (von: Dimension) dient der Deklaration von Variablen und zum Festlegen von (mehrdimensionalen) Feldern (engl. Array) für den angegebenen Variablentyp (normale Zahl bzw. Gleitpunkt oder Fließkomma; String bzw. Zeichenkette $ ; Ganzzahl bzw. Integer %), um z.B. Tabellen, Matrizen, Vektoren und dergleichen abzubilden. Die in Klammern anzugebende Index-Zahlen legen die Anzahl der Dimensionen und die Größe in jeder Dimension des Feldes fest. Eine Index-Zahl ist (theoretisch) durch das Maximum von 32767 begrenzt. Der Variablen-Index in einer Dimension fängt immer bei 0 an und kann maximal den Wert der entsprechenden Index-Zahl annehmen (die Ausdehnung einer Dimension beträgt also Index-Zahl + 1). Die Anzahl der Dimensionen (Indizes) eines Feldes beschränkt sich theoretisch auf maximal 255. Mit der Dimensionierung wird nicht nur der nötige Speicher reserviert, sondern die Werte automatisch mit 0 (bei Fließkomma und Ganzzahl) bzw. mit einer leeren Zeichenkette (Länge 0) vorbelegt. Limitiert wird diese Reservierung nur durch den frei für das BASIC zur Verfügung stehenden Speicher. Gängig ist beispielsweise die Verwendung von drei Dimensionen für Anwendungen im Bereich der 3D-Berechnungen und räumlichen Modellierung.

Werden Variablen mit einer Indizierung versehen, die unterhalb von 11 liegt (bei mehrdimensionalen Feldern von alle Indizes zu erfüllen), kann dies ohne den BASIC-Befehl DIM geschehen, da vom BASIC-Interpreter der Platz für ein entsprechend dimensionales Feld mit maximalem Index 10 in jeder Dimension automatisch reserviert wird.

Die Dimensionierung von nicht indizierten Variablen (Deklaration) hat seine Anwendung in der vorzeitigen Anlage der jeweiligen Variablen im Variablenbereich des BASIC-Interpreters (als einfache Liste organisiert, die sequenziell durchsucht werden muss). Dadurch kann man das Laufzeitverhalten insofern steuern und optimieren, indem häufig verwendete Variablen zuerst deklariert werden und sich damit am Anfang der Liste befinden. Diese Form ist eleganter als etwaige Pseudozuweisungen, die zudem mehr Programmplatz in Anspruch nehmen.
Die frühe Deklaration ist auch aus anderem Grunde vorteilhaft, da sonst undeklarierte Variablen den Variablenbereich bei der ersten Verwendung dynamisch erweitern und damit das zeitraubende Umkopieren des gesamten Array-Bereichs (wenn dieser sehr ausgedehnt ist) auslösen. Hier kann es dann zu merklichen, ungeplanten Verzögerungen im Programmablauf kommen.

Der Speicherverbrauch eines dimensionierten Arrays kann wie folgt berechnet werden:

Für den Vorspann (Header):

  • 2 Bytes für den Feldnamen
  • 1 Byte für die Anzahl der Dimensionen
  • 2 Bytes für die Größe einer Dimension (diese zwei Bytes so oft wie Dimensionen da sind)

Für die Daten (Feldelemente):

  • 2 Bytes für jedes Element bei Ganzzahlenvariablen (Integer)
  • 5 Bytes für jedes Element bei Gleitpunkt- bzw. Fließkommavariablen (normale, einfache Zahlenvariable)
  • 3 Bytes für jedes Element bei Zeichenkettenvariablen (String)
    plus je 1 Byte für jedes Zeichen innerhalb einer Zeichenkette.
    Dieser Verbrauch fällt aber nicht in den Variablenbereich, wird also nicht infolge eines DIM reserviert, sondern befindet sich im String-Heap bzw. als Konstantstring im Programmcode selbst.

Der BASIC-Befehl DIM darf nur einmal pro Variable ausgeführt werden, ansonsten erscheint die BASIC-Fehlermeldung REDIM'D ARRAY ERROR.
Wird der Höchstwert von 32767 Index-Zahlen überschritten, so gibt es die BASIC-Fehlermeldung ?ILLEGAL QUANTITY ERROR und wenn der RAM-Speicher für die Dimensionierung nicht ausreicht, wird die BASIC-Fehlermeldung ?OUT OF MEMORY ERROR ausgegeben.
Der spätere Zugriff auf ein Feldelement außerhalb der Dimensionsgrenzen wird mit ?BAD SUBSCRIPT ERROR quittiert.

[Bearbeiten] Beispiele

DIM Z(100) 

Die Gleitpunktvariable Z wird als Feld mit 101 Elementen dimensioniert (Index beginnt bei 0!).

DIM Z1$(12,31) 

Die Zeichenkettenvariable Z1$ wird auf eine Tabelle mit 13*32 Elementen dimensioniert;
Beispiel für Berechnungen in 2D: Jahreskalender mit Monat und Tag.

DIM Z%(22,15,11)

Die Ganzzahlenvariable Z% wird auf eine Matrix mit 23*16*12 Elementen dimensioniert;
Beispiel für Berechnungen in 3D: Länge, Breite, Höhe.

Q=1000: DIM A(Q), B$(Q), C%(Q) 

Es können auch mehrere Variablen gleichzeitig deklariert werden.

Q(10,5)=10 

Hier wird automatisch ein 2-dimensionales Feld mit Q(0,0) bis Q(10,10) angelegt. Alle Elemente bis auf Q(10,5) haben nun den Wert 0.

DIM I,J,K

Die Variablen werden deklariert und so als erste im Variablenbereich angelegt. Damit greift der Interpreter schneller auf sie zu, wenn diese später, z.B. durch entsprechende Schleifen in Matrizenberechnungen, extensiv verwendet werden.

POKE 49,PEEK(47) : POKE 50,PEEK(48)

Setzt man den STREND-Zeiger auf den Wert von ARYTAB, werden alle Arrays gelöscht und man kann ein Array erneut dimensionieren.

[Bearbeiten] Weblinks

WP-W11.png Wikipedia: Dynamischer Speicher (Heap)


In anderen Sprachen