AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überlagerung verschiedener Arrays

Ein Thema von MTornau · begonnen am 30. Aug 2006 · letzter Beitrag vom 30. Aug 2006
Antwort Antwort
MTornau

Registriert seit: 30. Aug 2006
14 Beiträge
 
#1

Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 10:34
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 !
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 10:46
Erst einmal herzlich Willkommen in der DP !

Außerdem muss ich dich noch auf einen Fehler in der Dimensionierung hinweisen: Das zweite Array ist doppelt so groß wie das erste.

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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#3

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 10:48
Hallo, Dein erster Post!
Herzlich Willkommen in der DP, MTornau!

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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 11:05
Zitat von Go2EITS:
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.
Hm, was genau meinst du damit? Ich kann dir nicht folgen.

Ergänzung zu meinem ersten Post:
Ein anderer Weg über variante Records, ebenfalls Zugriff auf ein und denselben Speicher:
Delphi-Quellcode:
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.
Oder eben, wie schon von meinem Vorredner vorgeschlagen, Kopieren des gesamten Arrays:

Delphi-Quellcode:
mem2[0, 0] := $FFFF;
  mem1 := TVirtualDingens1(mem2);
  Writeln(mem1[0, 0]);
  Writeln(mem1[0, 1]);
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#5

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 11:23
@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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 11:47
Öhm... gerade weil sizeof(Word) / sizeof(Byte) = 2 ist, wird doch eine Dimension in ihrer Länge halbiert!
Meine beiden Arrays belegen genau denselben Speicher. Und Pointer braucht man hier nirgendwo .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
MTornau

Registriert seit: 30. Aug 2006
14 Beiträge
 
#7

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 11:56
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.
Miniaturansicht angehängter Grafiken
nvram_145.jpg  
  Mit Zitat antworten Zitat
MTornau

Registriert seit: 30. Aug 2006
14 Beiträge
 
#8

Re: Überlagerung verschiedener Arrays

  Alt 30. Aug 2006, 13:19
Khabarakh ich habe Deine Variante einmal ausprobiert und mir gefällt das Ergebnis. 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 ...

Danke für die Hilfe, dieses Problem betrachte ich als gelöst.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz