| Wie speichert man Arrays im Speicher |
|
|
| Geschrieben von Christian Wimmer | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tuesday, 13. March 2007 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Wie speichert man Arrays im Speicher des Computers? Dieser Artikel beschreibt, was alles nötig ist, um ein Array im Speicher abzulegen und auf die Element zugreifen zu können.
Wenn man normalerweise von Arrays redet, dann meint man die Struktur und ihren Inhalt. Unter der Struktur meint man dann die Aufstellung der ArrayElemente. Das Problem bei diesem Ansatz ist, dass man dann immernoch nicht vom Aufbau des Arrays gesprochen hat. Unter dem Aufbau des Arrays versteht man dabei, die Anzahl der Dimensionen und deren Ober- und Untergrenzen. Zudem muss man noch die Komponentengröße im Speicher kennen, damit man im Speicher ein Element überspringen, und so zum nächsten Element gelangen kann. Den Aufbau des Arrays muss zusätzlich zum Arrayinhalt gespeichert werden. Weil der Aufbau so wichtig ist, hat dieser einen eigenen Namen : Dope. Ein eindimensionales Array ist noch ziemlich einfach. Ich werde daher zeigen, was man im Falle eines zweidimensionalen Arrays machen kann. Beliebig viele Dimensionen gehen analog. Siehe dazu auch den Wikeintrag zu Array . Beispiel: Array[1..2, 1..3] of Byte = {(1,2),(3,4),(5,6)}
Die erste (x) Dimension hat also 2 Elemente, die zweite Dimension 3 Elemente. Wir können diese Matrix auf zwei Arten linear machen : 1. Speichern der Elemente zeilenweise Koordinaten [x,y]: [1,1][1,2][1,3][2,1][2,2][2,3]
Wir werden zuerst die zeileweise Darstellung besprechen : Das Problem ist nun, wie man bei der zeilenweisen Darstellung beispielsweise an das Element 3 gelangen kann. Mit den Informationen aus dem Dope kann man das ganz einfach berechnen.
Wie kennen schon die Daten von 1 bis 5 aus der Array defintion oben. L2 ist also eine Variable mit dem Index 2, wobei 2 hier die Dimensionsgröße des Arrays (2) angibt. Die Elementgröße wird Alle anderen L's (hier nur noch L1) werden berechnet und müssten eigentlich garnicht im Dope gespeichert sein. Li = (OG(i+1) - UG(i+1) + 1) * L(i+1) Bei der (zeilenweisen) Berechnung ist das L der Dimension i also immer von der Dimension mit der größeren Zahl abhängig. Hier also Dimension 1 (i=1) von Dimension 2. Wir berechnung nun also (dynamisch) L1 :
Die Zeile 7 ist im Dope eigentlich nicht notwendig, da wir sie aus den gegeben anderen Zeilen leicht berechnen können. Wir können nun jede Position eines Elements im Speicher berechnen. Die Vorschrift dazu lautet : (1 bis dim)Σ (indexi - UGi)*Li In Worten : Beispiel : Array[2,3] = 5 (Wert) Die Werte stehen so im Speicher : 1,2,3,4,5,6 Nach der obigen Vorschrift wird die Position von 5 im Speicher so berechent : Wir müssen also 4 Elemente überspringen um das Element 5 lesen zu können.
Wir werden nun die spaltenweise Darstellung besprechen : Das Problem ist hier nun, wie man bei der spaltenweise Darstellung beispielsweise an das Element 5 gelangen kann. Mit den Informationen aus dem Dope kann man das ganz einfach berechnen.
Wie kennen schon die Daten von 1 bis 5 aus der Array defintion oben. L1 ist also eine Variable mit dem Index 1, wobei 1 hier die kleinste Dimensions des Arrays (1 von 2) angibt. Die Elementgröße wird Alle anderen L's (hier nur noch L2) werden berechnet und müssten eigentlich garnicht im Dope gespeichert sein. Li = (OG(i-1) - UG(i-1) + 1) * L(i-1) Bei der (spaltenweise) Berechnung ist das L der Dimension i also immer von der Dimension mit der eins kleineren Zahl abhängig. Hier also Dimension 2 (i=2) von Dimension 1. Wir berechnung nun also (dynamisch) L2 :
Die Zeile 7 ist im Dope eigentlich nicht notwendig, da wir sie aus den gegeben anderen Zeilen leicht berechnen können. Wir können nun jede Position eines Elements im Speicher berechnen. Die Vorschrift dazu lautet genauso wie bei der zeilenweisen Berechnung: (1 bis dim)Σ (indexi - UGi)*Li In Worten : Beispiel : Array[2,3] = 5 (Wert) Die Werte stehen so im Speicher : 1,4,2,5,3,6 Nach der obigen Vorschrift wird die Position von 5 im Speicher so berechent : Wir müssen also 3 Elemente überspringen um das Element 5 lesen zu können.
Geschrieben von Christian Wimmer @ 2007 v0.1 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Letzte Aktualisierung ( Tuesday, 13. March 2007 ) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| < zurück | weiter > |
|---|









