Delphi-PRAXiS

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)

EWeiss 24. Apr 2009 12:47


Mehrdimensionales Array variable auslegen
 
Wie kann ich das Array variabel auslegen?
Delphi-Quellcode:
ia:      array [0..767, 0..100] of byte;
Das ich die werte also zur laufzeit ändern kann.

gruss Emil

mkinzler 24. Apr 2009 12:49

Re: Mehrdimensionales Array variable auslegen
 
Als dynamischen Array:

Delphi-Quellcode:
ia: Array of Array of Byte;
oder
Delphi-Quellcode:
Type
    ByteArray = Array of Byte;
...
   ia: array of ByteArray;

EWeiss 24. Apr 2009 12:51

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von mkinzler
Als dynamischen Array:

Delphi-Quellcode:
ia: Array of Array of Byte;
oder
Delphi-Quellcode:
Type
    ByteArray = Array of Byte;
...
   ia: array of ByteArray;

Wie wird dann die neue länge als beispiel bei 100 zugewiesen ?

sorry wenn die frage was dumm daher kommt.

Danke schön ..

gruss Emil

mkinzler 24. Apr 2009 12:53

Re: Mehrdimensionales Array variable auslegen
 
Delphi-Quellcode:
SetLength( ia, 100);

himitsu 24. Apr 2009 12:55

Re: Mehrdimensionales Array variable auslegen
 
Delphi-Quellcode:
ia = Array of Array of Byte;
// oder einfach nur
ia = Array of {Types.}TByteDynArray;
Delphi-Quellcode:
// ia: Array[0..767, 0..100] of Byte;

SetLength(ia, 768);
For i := 0 to High(ia) do
  SetLength(ia[i], 101);

// oder

SetLength(ia, 768, 101);

EWeiss 24. Apr 2009 12:56

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
SetLength( ia, 100);

Ja bei eindimensional oder ?
Das ist was ich nicht verstehe... in dem zusammenhang

Delphi-Quellcode:
var
  ia : array of byte
länge zuweisen..
Delphi-Quellcode:
Setlength(ia, 100);
Habe hier aber 2 einträge ..
Delphi-Quellcode:
ia: array [0..767, 0..100] of byte;
Muss ja in dem fall wissen welcher seite ich den neuen wert zuweise.

gruss Emil

EWeiss 24. Apr 2009 12:59

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
ia = Array of Array of Byte;
// oder einfach nur
ia = Array of {Types.}TByteDynArray;
Delphi-Quellcode:
// ia: Array[0..767, 0..100] of Byte;

SetLength(ia, 768);
For i := 0 to High(ia) do
  SetLength(ia[i], 101);

// oder

SetLength(ia, 768, 101);

Ahh High wäre dann der zweite eintrag
Danke schön.

EDIT:
warum dann einen wert mehr ?
aus 767 wird 768 ?

gruss Emil

mkinzler 24. Apr 2009 13:01

Re: Mehrdimensionales Array variable auslegen
 
Nein Heigh ermittelt die obere Grenze des 1. Wertes

himitsu 24. Apr 2009 13:02

Re: Mehrdimensionales Array variable auslegen
 
[info] hab oben was editiert :angel2:

vielleicht fällst es so besser auf, wenn man das trennt ... ergibt Beides das Selbe
Delphi-Quellcode:
ia: Array[0..767, 0..100] of Byte;

ia: Array[0..767] of Array[0..100] of Byte;
und nu erkennt man auch, warum man es wie mit SetLength bearbeiten kann.

PS: hier kann man natürlich auch jedem Unterarray eine eigene Länge verpassen
(nicht alle Arrays der selben Ebene müssen gleich groß sein)

[add]
Zitat:

Zitat von EWeiss
EDIT:
warum dann einen wert mehr ?
aus 767 wird 768 ?

weil 0 bis 767 nunmal 768 Felder sind? :zwinker:


[add2]
hier nochmal das Ganze mit 3 Ebenen ... dürfte do dann hoffentlich klarer werden lassen
Delphi-Quellcode:
ia: Array[0..99, 0..199, 0..299] of Byte;

ia: Array[0..99] of Array[0..199] of Array[0..299] of Byte;

ia: Array of Array of Array of Byte;

SetLength(ia, 100, 200, 300);

SetLength(ia, 100);
For i1 := 0 to High(ia) do Begin { 0 to Length(ia) - 1 }
  SetLength(ia[i1], 200);
  For i2 := 0 to High(ia[i1]) do { 0 to Length(ia[i1]) - 1 }
    SetLength(ia[i1, i2], 300); // SetLength(ia[i1][i2], 300);
End;

EWeiss 24. Apr 2009 13:15

Re: Mehrdimensionales Array variable auslegen
 
Hab es jetzt so gemacht..
Delphi-Quellcode:
var
ia : Array of Array of byte;
Delphi-Quellcode:
nHeight:= PicBB.Height;
nImageSize:= (256*nHeight)*3;
SetLength(ia, 768, nHeight + 1);
jetzt springt er in System.pas rein und meldet
Delphi-Quellcode:
function LoadResString(ResStringRec: PResStringRec): string;
Zugriffsverletzng .. schreiben von Adresse.

Übergebe ich das Array normal
Delphi-Quellcode:
ia: array [0..767, 0..100] of byte;
dann funktioniert es.

gruss Emil

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

sirius 24. Apr 2009 15:04

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
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

Meinen Funktionen, die alle Felder eines Objektes speichern, ist das halt völlig egal. Es wird eben in der Reihenfolge ausgelesen und am Ende so reingeschrieben.

sirius 24. Apr 2009 15:06

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von EWeiss
Mir fällt im moment auch nichts ein wie ich sie sonst übergeben kann.
Komme um ein array nicht herum.

gruss Emil

Du willst also das Array direkt in das Bitmap kopieren?

himitsu 24. Apr 2009 15:15

Re: Mehrdimensionales Array variable auslegen
 
jupp, möchte er, also er kopiert das BitMap in ein Array bearbeitet es und kopiert es dann wieder zurück.

Aber da könnte man doch eigentlich ein "virtuelles" Array direkt über das Bitmap legen :gruebel:


Zitat:

Zitat von sirius
Meinen Funktionen, die alle Felder eines Objektes speichern, ist das halt völlig egal. Es wird eben in der Reihenfolge ausgelesen und am Ende so reingeschrieben.

wenn du aber die Daten direkt in den Speicher rein-/rauskopieren willst, dann ist es halt nicht egal

und bei meier XML-Serialisierung lese ich das SaveArray direkt aus und wandle es um (wenn ich da für jeden einzelnen Eintrag über die Variant-Funktionen gehn würde, wäre das nicht unbedingt effektiv :stupid: )

sirius 24. Apr 2009 15:35

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
wenn du aber die Daten direkt in den Speicher rein-/rauskopieren willst, dann ist es halt nicht egal

Doch, grade da. Weil mir ist es wurscht, wie die Daten dann zwischengespeichert sind, ich will sie ja nicht interpretieren.

Zitat:

Zitat von himitsu
Aber da könnte man doch eigentlich ein "virtuelles" Array direkt über das Bitmap legen

Ja. Kann man sich sogar eine kleine Klasse drumherum basteln. Habe ich für ein Icon auch gemacht. Da gibt es nur einen Zeiger, der an den Anfang des Bildes/Arrays zeigt und einen Getter und einen Setter für die Pixel, damit ich sie verändern kann.

himitsu 24. Apr 2009 15:40

Re: Mehrdimensionales Array variable auslegen
 
haben gerade etwas PNt und ich hab auch mal einiges zum "virtuellen" Array mitgeschickt :angle:

[ot]OK, ich hab den Inhalt ja interpretiert und dann die Werte einzeln auf eigene Unter-Nodes verteilt :stupid:
(siehe meine letzer Post in himXML)

EWeiss 24. Apr 2009 15:43

Re: Mehrdimensionales Array variable auslegen
 
Zitat:

Zitat von himitsu
haben gerade etwas PNt und ich hab auch mal einiges zum "virtuellen" Array mitgeschickt :angle:

[ot]OK, ich hab den Inhalt ja interpretiert und dann die Werte einzeln auf eigene Unter-Nodes verteilt :stupid:
(siehe meine letzer Post in himXML)

Danke dir auch für deine Hilfe !!!
Natürlich auch Sirius für seine Anregungen.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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