![]() |
Überlagerung verschiedener Arrays
Moin !
Ich habe ein Array, das aus Bytes besteht. ---> VirtuelleSpeicherSeite1_B : Array[0..15] of Array[0..15] of Byte; Jetzt möchte ich ein zweites Array anlegen, das genau den gleichen Speicher nutzt, aber statt Bytes Word benutzt. --> VirtuelleSpeicherSeite1_S : Array[0..7] of Array[0..7] of Byte; Rein theoretisch sieht das ganze dann so aus für die erste Zeile im Speicher ... ------------------------------------- |-B-|-B-|-B-|-B-|-B-|-B-|-B-|-B-| VirtuelleSpeicherSeite1_B ------------------------------------- |---S----|---S---|---S----|---S---| VirtuelleSpeicherSeite1_S ------------------------------------- Kann mir einer an dieser Stelle helfen ? Danke ! |
Re: Überlagerung verschiedener Arrays
Erst einmal herzlich Willkommen in der DP :D !
Außerdem muss ich dich noch auf einen Fehler in der Dimensionierung hinweisen: Das zweite Array ist doppelt so groß wie das erste.
Delphi-Quellcode:
VirtuelleSpeicherSeite1_S : Array[0..15] of Array[0..7] of Word;
Code:
Sizeof(Array1) = 16 * 16 * 1 Byte = 256 Byte
Sizeof(Array2) = 16 * 8 * 2 Byte = 256 Byte
Delphi-Quellcode:
type
TVirtualDingens1 = Array[0..15] of Array[0..15] of Byte; TVirtualDingens2 = Array[0..15] of Array[0..7] of Word; var mem1 : TVirtualDingens1; mem2 : TVirtualDingens2 absolute mem1; begin mem2[0, 0] := $FFFF; Writeln(mem1[0, 0]); Writeln(mem1[0, 1]); Readln; end. |
Re: Überlagerung verschiedener Arrays
Hallo, Dein erster Post!
Herzlich Willkommen in der DP, MTornau! :hi: Bin zwar nicht der Oberprofi wie die anderen in der DP, aber ich glaube Du bekommst Schwierigkeiten: Wenn Du die Adresse vom Byte Array im Speicher hast und auf Word erweitern möchtest und dabei die Inhalte erhalten bleiben sollen, so ist dies nicht möglich: Mit der Erweiterung auf Word über Zeiger überschreibst Du schon die ersten beiden Bytes mit einem Word. Das Word Array wird doppelt so groß wie das byte Array (ein Word besteht aus zwei Bytes) und du könntest Daten die sich über die Arraygrenzen Deine Bytes Array befinden überschreiben. Einzigste Lösung momentan: Array of Word anlegen und Bytes reinkopieren. Dann hast Du die Werte in einem Word Array. Delphi ist da sehr fix. Was möchtest Du eigentlich wirklich damit bezwecken? Vielleicht können wir Dir dann einen besseren Lösungweg aufzeigen. Beste Grüße Go2EITS |
Re: Überlagerung verschiedener Arrays
Zitat:
Ergänzung zu meinem ersten Post: Ein anderer Weg über variante Records, ebenfalls Zugriff auf ein und denselben Speicher:
Delphi-Quellcode:
Oder eben, wie schon von meinem Vorredner vorgeschlagen, Kopieren des gesamten Arrays:
TMemory = record
case Byte of 0: (ByteArray : TVirtualDingens1); 1: (WordArray : TVirtualDingens2); end; var mem : TMemory; begin mem.WordArray[0, 0] := $FFFF; Writeln(mem.ByteArray[0, 0]); Writeln(mem.ByteArray[0, 1]); Readln; end.
Delphi-Quellcode:
mem2[0, 0] := $FFFF;
mem1 := TVirtualDingens1(mem2); Writeln(mem1[0, 0]); Writeln(mem1[0, 1]); |
Re: Überlagerung verschiedener Arrays
@Khabarakh
Wenn Du ein Byte hast benötigst Du eine Speicherstelle des Arrays. Wenn Du ein Word hast benötigst Du zwei Speicherstellen. Wenn Du ein Byte-Array mit Word aufüllen willst kannst Du bei einem Array[1..10] of Byte nur die Stellen 1,3,5,7,9 also mit fünf WORDs auffüllen, weil ja ein Word 2 Bytes benötigt. Mehr Platz hast Du nicht. (Vorausgesetzt, Du arbeitest mit Zeigern und schaltest die Typeüberprüfung des Compilers ab, denke ich - hab es aber nicht ausprobiert!) Alles klar? Mir erscheint die Lösung mit einem Varianten Record (Delphi Hilfe) die beste Lösung zu sein, da der Compiler den größen Wert im Record im Speicher reserviert. |
Re: Überlagerung verschiedener Arrays
Öhm... gerade weil sizeof(Word) / sizeof(Byte) = 2 ist, wird doch eine Dimension in ihrer Länge halbiert! :gruebel:
Meine beiden Arrays belegen genau denselben Speicher. Und Pointer braucht man hier nirgendwo ;) . |
Re: Überlagerung verschiedener Arrays
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal Danke für die nette Begrüßung !
Die Korrektur mit dem Word Array ist natürlich völlig richtig. Das eine Array basiert auf Byte und das andere hat nur halb soviel Stellen, ist aber Word und damit genauso groß. Ich hol' etwas weiter aus, um zu erklären was Sinn und Zweck dieser Übung ist. Ich arbeite an einem NVRAM-Generator, der es mir ermöglich für ein spezifisches NVRAM Hex-Dateien zu generieren. Im NVRAM wird jede Speicherzelle als Byte (unsigned char) abgelegt. Speichere ich z.B. längere Wert z.B. Word (2 Bytes), so muss ich diese aufteilen. Ich möchte jetzt eine virtuelle Speicherseite erzeugen, die den Inhalt der ersten NVRAM Seite abbildet. Um mir später die graphische Darstellung zu erleichtern, wollte ich mehrere Arrays überlagern. Ein Beispiel: Im NVRAM steht an Adresse 0,0 und 1,0 der Wert 0x03E8H. Dieser Wert, in zwei Bytes zerlegt sieht so aus : 0x03H und 0xE8H. Anbei die graphische Darstellung ohne virtuelle Speicherseiten. |
Re: Überlagerung verschiedener Arrays
Khabarakh ich habe Deine Variante einmal ausprobiert und mir gefällt das Ergebnis. :-D Eine andere Idee, die mir gerade noch einfiel, war die Variante mit wilden Pointer auf die einzelnen Speicherbereiche zu zielen und anhand der Pointer die Typen zu lesen und zu schreiben. Manchmal ist man doch ein wenig vernagelt ... :gruebel:
Danke für die Hilfe, dieses Problem betrachte ich als gelöst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz