Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array mit zur Designzeit unbekannten Dimensionen (https://www.delphipraxis.net/71315-array-mit-zur-designzeit-unbekannten-dimensionen.html)

DevilsCamp 13. Jun 2006 08:23


Array mit zur Designzeit unbekannten Dimensionen
 
Gibt es ein Möglichkeit, die Dimensionen eines Arrays zur Laufzeit anzugeben?

Delphi-Quellcode:
var
  ar : array of Integer;
  br : array of array of Integer
gibt mir ja nur ein ein-Dimensionales (ar) bzw. zwei-Dimensionales (br) Array.

Doch ich bräuchte ein Array, bei dem erst zur Laufzeit bekannt wird, wieviele Dimensionen es besitzen wird.
Gibt es da eine Möglichkeit bzw. kennt jemand eine Klasse, die mir sowas zur Verfügung stellt?

mkinzler 13. Jun 2006 08:25

Re: Array mit zur Designzeit unbekannten Dimensionen
 
Wäre mir nicht bekannt. könntest es aber mit Listen realisieren.

Union 13. Jun 2006 09:40

Re: Array mit zur Designzeit unbekannten Dimensionen
 
Hallo,

versuch es doch mal mit Variant-Arrays:
Zitat:

Zitat von Delphi-Hilfe
Delphi-Quellcode:
var
  A: Variant;
begin
  A := VarArrayCreate([0, 4], varVariant);
  A[0] := 1;
  A[1] := 1234.5678;
  A[2] := 'Hello world';
  A[3] := True;
  A[4] := VarArrayOf([1, 10, 100, 1000]);
  WriteLn(A[2]);   { Hello world }
  WriteLn(A[4][2]);   { 100 }

end;


marabu 13. Jun 2006 10:32

Re: Array mit zur Designzeit unbekannten Dimensionen
 
Hallo Marc,

wenn es unbedingt arrays sein müssen, dann hilft in der Regel eine Adressumsetzung. Dabei wird mit den zur Laufzeit festgelegten Dimensionen auf ein eindimensionales Array zugegriffen:

Delphi-Quellcode:
var
  ida: array of Integer;
  dims: array of Integer;

function IntProduct(n: array of Integer): Integer;
var
  i: Integer;
begin
  if Length(n) > 0 then
  begin
    Result := n[0];
    for i := 1 to High(n) do
      Result := Result * n[i];
  end else Result := 0;
end;

function FlatIndex(const dims, idx: array of Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := Low(idx) to High(idx) do
    Result := Result * dims[i] + idx[i];
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  i, j, k: Integer;
begin
  SetLength(dims, 3);
  dims[0] := 4;
  dims[1] := 6;
  dims[2] := 3;
  SetLength(ida, IntProduct(dims));
  for i := 0 to 3 do
    for j := 0 to 5 do
      for k := 0 to 2 do
        ListBox.Items.Add(IntToStr(FlatIndex(dims, [i, j, k])));
end;
Plausibilitätsprüfungen musst du noch einbauen.

Grüße vom marabu

DevilsCamp 13. Jun 2006 11:46

Re: Array mit zur Designzeit unbekannten Dimensionen
 
@marabu:
Danke, das werde ich mir mal merken.

Allerdings nutzt mir das bei meinem jetzigen Projekt leider nichts, da die Größe einer Dimension erst bestimmt werden kann, wenn die Dimension vorher erst berechnet wurde.

Aber ich habe mein Problem jetzt mit Hilfe des VirtualStringTrees gelöst.


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