Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrdimensionales Array variable auslegen (https://www.delphipraxis.net/133052-mehrdimensionales-array-variable-auslegen.html)

himitsu 24. Apr 2009 13:19

Re: Mehrdimensionales Array variable auslegen
 
[info] ... ich editiere wohl zuviel :lol: (siehe oben bei [add2])

aber du weißt, daß dynamische Arrays Pointer sind?

bei Array[x..y] of Array[x..y] of liegen die einzelnen werte im Speicher alle als Schlange hintereinander, wärend beim dynamischen Array in den Oberen Ebenen nur Zeiger auf die Arrays liegen und die Werte somit versteut ind nicht schön hintereinander rumliegen.

EWeiss 24. Apr 2009 13:20

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
[info] ... ich editiere wohl zuviel :lol: (siehe oben bei [add2])

aber du weißt, daß dynamische Arrays Pointer sind?

bei Array[x..y] of Array[x..y] of liegen die einzelnen werte im Speicher alle als Schlange hintereinander, wärend beim dynamischen Array in den Oberen Ebenen nur Zeiger auf die Arrays liegen und die Werte somit versteut ind nicht schön hintereinander rumliegen.

hmm wird als pointer übergeben kracht aber.
Delphi-Quellcode:
MoveMemory(@ia, pAddr, nImageSize);
EDIT:
Delphi-Quellcode:
  SetLength(ia, 768);
  For IntI := 0 to High(ia) do
    SetLength(ia[IntI], nHeight+1);
auch die version bringt das Prog zum absturz.

gruss Emil

himitsu 24. Apr 2009 13:34

Re: Mehrdimensionales Array variable auslegen
 
nein, das dynamische Array selber läuft delphiintern über einen Pointer :warn:

bei einem 1-dimensionalem Array kann man das leicht beheben, indem man diesen Zeiger entsprechend (de)referenziet,
aber bei mehrdimensionalen Arrays hast du so nur Einfluß auf den Pointer der 1. Ebene und nicht auf die der Drunterliegenden.

ein dynamisches Array ist wie ein String/AnsiString
ein statisches eher wie ein ShortString/String[x] oder
Delphi-Quellcode:
record
  element0, element1, .... elementN: Byte;
end;
Delphi-Quellcode:
staticArray = record
  element0, element1, .... elementN: Byte;
end;

intDynamicArray = record
  Header: record;
    Referenzzähler: Elementanzahl: Integer;
  end;
  element0, element1, .... elementN: Byte;
end;
dynamicArray = (@intDynamicArray + SizeOf(Header));
und dein 2-Dimensionales sieht intern etwa so aus :freak:
Delphi-Quellcode:
intDynamicArrayEbene1 = record
  Header: record;
    Referenzzähler: Elementanzahl: Integer;
  end;
  element0, element1, .... elementN: Byte;
end;
intDynamicArray = record
  Header: record;
    Referenzzähler: Elementanzahl: Integer;
  end;
  element0, element1, .... elementN: je (@intDynamicArrayEbene1 + SizeOf(Header));
end;
dynamicArray = (@intDynamicArray + SizeOf(Header));

EWeiss 24. Apr 2009 13:45

Re: Mehrdimensionales Array variable auslegen
 
Danke für die erklärung ;)
Nur wie kann ich den Fehler jetzt beheben ?

Habe testweise mal den pointer "ia" so übergeben.
Delphi-Quellcode:
MoveMemory(@ia[0,0], pAddr, nImageSize);
Dann springt er nicht mehr in die System.pas bringt mir aber einen irregulären wert anstelle von
Delphi-Quellcode:
  MoveMemory(@ia[0,0], pAddr, nImageSize);
  //' Fade The Data.
  for dy := 0 to nHeight do
  begin
    for dx := 0 to (765 div 3) do
    begin
      b := ia[(dx * 3), dy] - 15;
ia[(dx * 3) sollte 3 sein beim ersten durchlauf
gibt mir aber 68000 und noch was aus.

irgendwas ist da total faul.

Benötige aber ein dynamisches Array weil sonst die Bitmap Dimensionen nicht mehr stimmen.
Die ausgabe ist unbedingt von der aktuellen höhe des bitmap abhängig
also nHeight + 1

Eine Variable kann ich in Delphi einem statischen array leider nicht übergeben.

gruss Emil

himitsu 24. Apr 2009 14:00

Re: Mehrdimensionales Array variable auslegen
 
du kannst ein mehrdimensionales dynamisches Array nicht direkt übergeben.

praktisch müßtst du dir ein temporäres eindimensionales (dynamisches) Array erstellen, darin die Daten speichern lassen und dann die Daten auf dein mehrdimensionales Array umkopieren.

Oder du kannst die Daten stückchenweise speichern lassen (falls das die Speicherfunktion unterstützt) und speichst so jedes UnterArray einzeln ab.

[add]
wenn der Variant die ArrayDaten nicht so dermasen krank serialisieren würde, hätte man dieses auch infach mißbrauchen können (aber dort werden die Ebenen leider in umgekehrter Reinfolge abgelegt)

EWeiss 24. Apr 2009 14:05

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
du kannst ein mehrdimensionales dynamisches Array nicht direkt übergeben.

praktisch müßtst du dir ein temporäres eindimensionales (dynamisches) Array erstellen, darin die Daten speichern lassen und dann die Daten auf dein mehrdimensionales Array umkopieren.


Dann muss ich mal sehn wie ich das hinbekomme. :wall:

Danke.

Gruss Emil

sirius 24. Apr 2009 14:24

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
[add]
wenn der Variant die ArrayDaten nicht so dermasen krank serialisieren würde, hätte man dieses auch infach mißbrauchen können (aber dort werden die Ebenen leider in umgekehrter Reinfolge abgelegt)

Ein VarArray (was ja eigentlich ein SafeArray ist, was wiederum bspw. VB verwendet) ist mir aber zuerst eingefallen. Sollte man vielleicht noch mal genauer überlegen, hängt natürlich von der Verwendung ab.

EWeiss 24. Apr 2009 14:46

Re: Mehrdimensionales Array variable auslegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mein Problem ist das hier siehe Bild.
Wenn die dimension des Bitmaps das im array festgelegt wird nicht stimmt
wird die vis nicht richtige dargestellt.

Da der Player mit eigenen Skins ausgelegt ist die größe des Vis Window nicht immer gleich.

Schwierig das Thema und keine lösung in sicht ;)

gruss Emil

himitsu 24. Apr 2009 14:48

Re: Mehrdimensionales Array variable auslegen
 
wie gesagt, ich hatte ja grad gestern bezüglich meiner XML-Serialisierung damit zu kämpfen ...

Delphi-Quellcode:
z: array of array of Byte;

z[0, 0] := 00;
z[0, 1] := 01;
z[0, 2] := 02;
z[1, 0] := 10;
z[1, 1] := 11;
z[1, 2] := 12;

// so sind ja die Bilddaten gespeichert
00 01 02 10 11 12

// so würden sie aber in einem Variant/SafeArray
00 10 01 11 02 12

EWeiss 24. Apr 2009 15:03

Re: Mehrdimensionales Array variable auslegen
 
Mir fällt im moment auch nichts ein wie ich sie sonst übergeben kann.
Komme um ein array nicht herum.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 2 von 3     12 3      

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