Zwei Links zu Thema 4D Arrays beziehungsweise MehrDimensionalen Arrays
http://wimmer.teamchris.info/joomlatest/content/view/84/53/lang,de/http://de.wikipedia.org/wiki/Feld_%28Datentyp%29Für den speziellen Fall des 4D Array nochmal ein genauere Beschreibung
Wie die vorhergehende Artikel es schon beschreiben werden alle n-Dimensionalen Arrays stehts gleich beschrieben bzw gespeichert.
Es bedarf stets 2 Dinge
Nr 1 Berechnung des Speicherbereiches für das Array
Nr 2 Ermittlung des Indexes des Arrays für ein angegebenes Feld
BSP:
Ich benötige ein 4D Array Folgender Grösse [2,4,2,2]
Nun muss man sich die Frage stellen, wieviel Speicher dieses Array benötigt
Wir möchten der Einfachheit halber den DatenTyp BOOL speichern also Bits.
Hätte Ich ein Ein-Dimensionales Array der Grösse 2 so bräuchte ich 2 Bits um diese zu speichern
Erweitere ich dieses Array um eine Dimension der Grösse 4 so benötige ich 8 Bits(Die Anzahl der Speicherbereiche für alle Vorhergehenden Dimensionen multipliziert mit der Grösse meiner neuen Dimension. Also in diesem Fall 2*4=8 )
Die nächste Dimension Nr 3 folgt dem gleichen Prinzip
Somit ergibts sich eine Speichergrösse von 16
Bei der 4 beträgt die Speichergrösse dann 32
Somit benötige ich 32 Bits an Speicher
(Kurzum erkennt man, dass man einfach nur alle Dimensiongrössen miteinander multiplizieren muss 2*4*2*2=32)
Als 2. Der Index.
Um den Index zu berechnen muss man für jede Dimension wissen, wieviele Felder im Speicher die jeweils nachfolgenden Dimensionen belegen.
Die Speicher Belegung eines Arrays definiert sich ja über die Multiplikation aller Dimensionsgrössen.
Für unser Beispiel eines Feldes [2,4,2,2] belegen folglich die letzen 3 Dimensionen 4*2*2= 16 Speicherplätze
Auf diesen SpeicherPlätzen sind alle Werte unseres Arrays für den (FeldIndex 1) =1 gespeichert also[1,1-4,1-2,1-2]
Somit ergibt sich eine Art Offset,der SpeicherBereichAnfangsSprungOffset (SBASO) für eine DimensionsIndexerhöhung
Alle Dimension, ausser die Letzte, bestitzen solch einen SpeicherBereichAnfangsSprungOffset der angibt um wieviele Felder sich die Adresse in unserem Speicherbereich verschiebt wenn sich der DimensionIndex um 1 erhöht
Für unser Beispiel:
hat die 2.Dimension einen Offset von 4 Also 2*2 (3. und 4. Dimension)
und die 3. Dimension einen Offset von 2 (4.Dimension)
Nun kann man den Speicherbereich mit diesen Werten berechnen
Wenn ich nun den Bereich oder Index im Speicher für (2,3,2,1) Berechnen möchte
rechne ich einfach: Index= (Index1-1)*SBASO1+(Index2-1)*SBASO2 + (Index3-1)*SBASO3 +Index4
Index = (2 -1) * 16+(3 -1)* 4 + (2 -1)* 2 + 1
Index= 27
Nun zu KRL
Man schreibt sich ein Modul in dem man in der Dat ein einDimensionales Feld generiert
Die Grösse definiert sich über die Anzahl der Dimensionen n von seinem Mehrdimensionalem Array und den Dimensionsgrössen derer(siehe oben)
Nun schreibt man sich in der SRC z.b. Globale Funktionen um mit dem Array zu arbeiten
zb.
setValue(Index1, Index2, Index3, Index4,Value )
getValue(Index1, Index2, Index3, Index4)
clearAll()
Die Grösse seines Arrays ist durch die maximale Grösse des einDimensionalen Arrays in Bezug auf den Datentyp begrenzt. wobei man diese Grenze auch übergehen kann in dem man seine Daten in mehreren einDimensionalen Arrays speichert.