Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Array indizieren (https://www.delphipraxis.net/84398-dynamisches-array-indizieren.html)

DelphiManiac 16. Jan 2007 14:26


Dynamisches Array indizieren
 
Hallo,

ich brauche für meine Anwendung ein 2 Dimensionales dynamisches Array.
Ich lese eine Datei aus, und weiß weder am Anfang wieviel Zeilen, noch wieviel ASCII's drin stehen.

Delphi-Quellcode:
..
var
  DynArr:array of array of byte;
begin
 SetLengt(DynArr,10); // 10 Zeilen
 Set...              // 30 Zeichen???
...
Wie kann ich nun mein Array indizieren, so dass es Beispiel:
eine Größe von DynArr[1..10][1..30] hat.
Will das natürlich zur Laufzeit machen (deshalb ja dynamisch).
Hoffe ihr habt mein Prob verstanden.

Danke schonmal im Vorraus :lol:

Gruß
DelphiManiac

fwsp 16. Jan 2007 14:29

Re: Dynamisches Array indizieren
 
Zitat:

Zitat von Delphi 7 Hilfe
Zur Deklaration von mehrdimensionalen dynamischen Arrays verwenden Sie aufeinander folgende array of ...-Konstruktionen. Ein Beispiel:

Delphi-Quellcode:
type TMessageGrid = array of array of string;
var Msgs: TMessageGrid;
Hier wird ein zweidimensionales String-Array deklariert. Um dieses Array zu instantiieren, rufen Sie SetLength mit zwei Integer-Argumenten auf. Wenn beispielsweise I und J Integer-Variablen sind, wird Speicherplatz für ein I mal J großes Array zugewiesen:

Delphi-Quellcode:
SetLength(Msgs,I,J);
Msgs[0,0] bezeichnet dann ein Element dieses Arrays.

Sie können auch mehrdimensionale dynamische Arrays anlegen, die nicht gleichförmig sind. Rufen Sie dazu als Erstes die Funktion SetLength auf, und übergeben Sie ihr Parameter für die ersten n Dimensionen des Arrays:

Delphi-Quellcode:
var Ints: array of array of Integer;
SetLength(Ints,10);
Mit dieser Anweisung weisen Sie dem Array Ints Speicherplatz für zehn Zeilen zu. Den Speicher für die Spalten können Sie später einzeln zuweisen (und dabei unterschiedliche Längen angeben):

Delphi-Quellcode:
SetLength(Ints[2], 5);
Die dritte Spalte von Ints kann damit fünf Integer-Werte aufnehmen, und Sie können ihr nun Werte zuweisen (auch wenn die anderen Spalten nicht zugewiesen sind), z. B. Ints[2,4] := 6.

Im folgenden Beispiel wird mithilfe von dynamischen Arrays (und der in der Unit SysUtils deklarierten Funktion IntToStr) eine ungleichförmige String-Matrix erstellt:

Delphi-Quellcode:
var
  A : array of array of string;
  I, J : Integer;
begin
  SetLength(A, 10);
  for I := Low(A) to High(A) do
  begin
    SetLength(A[I], I);
    for J := Low(A[I]) to High(A[I]) do
      A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
  end;
end;


Tormentor32 16. Jan 2007 14:30

Re: Dynamisches Array indizieren
 
Delphi-Quellcode:
SetLengt(DynArr,10);
for i := 0 to 9 do
SetLength(DynArr[i],30));
edit: War zu langsam :stupid:

DelphiManiac 16. Jan 2007 14:32

Re: Dynamisches Array indizieren
 
Hi,

Danke für die schnelle Antwort!!! :o
Also gibt es doch eine überladene Funktion von SetLength!!

Irgendwie war das aus der Delphi-Hilfe nicht so ersichtlich....

Naja danke nochmal

Christian Seehase 16. Jan 2007 15:18

Re: Dynamisches Array indizieren
 
Moin DelphiManiac,

Zitat:

Zitat von DelphiManiac
Also gibt es doch eine überladene Funktion von SetLength!!

Jein.
Diese Funktion basiert auf Compiler-Magic (wie, z.B. auch Inc, Dec), sie existiert so als Funktion nicht.

DelphiManiac 16. Jan 2007 15:37

Re: Dynamisches Array Länge feststellen
 
Hallo,

ja stimmt da hast du Recht,

hab noch ne andere Frage:

Wie bekomme ich zur Laufzeit die Größe meiner 2 Dimensionen des Arrays heraus??

Flare 16. Jan 2007 15:50

Re: Dynamisches Array indizieren
 
Delphi-Quellcode:
rows := high(DynArray)+1;
cols := high(DynArray[0])+1;
Musst nur aufpassen, wenn DynArray noch 0 Elemente hat...also davor das abfangen :stupid:

Flare

halinchen 16. Jan 2007 15:53

Re: Dynamisches Array indizieren
 
Delphi-Quellcode:
Length(Array);
Oder halt die 2 Dimension von:
Delphi-Quellcode:
Length(Array[x]);
Wobei x für das Element steht, wessen Dimension du rausbekommen möchtest und Array für deinen Array.


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