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 wenn array eigenes objekt (https://www.delphipraxis.net/108200-dynamisches-array-wenn-array-eigenes-objekt.html)

Mr. Pink 8. Feb 2008 18:42


dynamisches array wenn array eigenes objekt
 
hallo,
ich habe nen 2-dim-array als eigenes objekt definiert, um es so leichter als parameter an funktionen zu übergeben.
Delphi-Quellcode:
type
     TMyArray = Array[1..6,1..6] of Integer;
würde jetzt aber gerne die größe (ist quadratisch) variabel halten, also als dynamisches array - am besten auch die dimension, wobei jede dimension gleich groß wäre.

weiss wer wie ich das am besten machen kann?
könnte mir vorstellen, dass das mit der dimension weit aus schwieriger ist, als mit der größe, die größe ist aber auch wichtiger, das muss doch auch iwie zu machen sein...

DANKE schonmal - zumindet fürs lesen;)

wicht 8. Feb 2008 18:51

Re: dynamisches array wenn array eigenes objekt
 
Suchst du die Funktion SetLength()? Ansonsten verstehe ich dein Problem nicht :drunken: :stupid:

Mr. Pink 8. Feb 2008 19:05

Re: dynamisches array wenn array eigenes objekt
 
ich glaube nicht, jedenfalls funzt das mit der nicht so wies soll, hab folgendes ausprobiert, was mir aber nciht wirklich weiterhalf:
Delphi-Quellcode:
type
     TMyArray = Array of Array of Integer;
     TMyHauptKlasse=class
     private
       procedure bla;
     end;

implementation

var Feld: TMyArray;

procedure TMyHauptklasse.bla;
begin
  SetLength(Feld,6,6);
end;
da bekomme ich ne fehlermeldung wegen zugriffsverletzung... :wall:

mkinzler 8. Feb 2008 19:08

Re: dynamisches array wenn array eigenes objekt
 
Existiert den eine Instanz von TMyHauptKlasse?

Mr. Pink 8. Feb 2008 19:16

Re: dynamisches array wenn array eigenes objekt
 
ok, mein fehler, hab mit falschen werten getestet -.- sorry.

aber das problem mit dem variabel halten der dimension bleibt... hat da wer ne idee?

danke schonmal fürs weiterhelfen ;)

Medium 8. Feb 2008 22:09

Re: dynamisches array wenn array eigenes objekt
 
Das Problem ist doch gelöst. Dimensionsfreie Deklaration, und in der Implementierung mit SetLength() die Größe setzen. Das ist der einfachste Weg überhaupt, und im Kern auch der einzige (man kanns nur komplizierter hinschreiben, wer will das schon). Wovon du dich halt verabschieden musst, sind beliebige untere Grenzen. 0 ist immer dein erster Index, was nun aber nicht wirklich ein Problem sein sollte denke ich.

wicht 9. Feb 2008 13:05

Re: dynamisches array wenn array eigenes objekt
 
Delphi-Quellcode:
procedure TMyHauptklasse.bla;
begin
  SetLength(Feld,6,6);
end;
müsste eher

Delphi-Quellcode:
procedure TMyHauptklasse.bla;
var
  i: Integer;
begin
  SetLength(Feld, 6);
  for i := 0 to High(Feld) do
    SetLength(Feld[i], 6);
end;
sein.

r2c2 9. Feb 2008 16:03

Re: dynamisches array wenn array eigenes objekt
 
Zitat:

Zitat von Mr. Pink
aber das problem mit dem variabel halten der dimension bleibt... hat da wer ne idee?

Warum Arrays, wenn man auch Klassen nehmen kann? Wir haben doch die OOP...

Delphi-Quellcode:
// Pseudocode:
type
  TVarDimListDimension = class(TObjectList)
    ...
  end;

  TVariableDimList = class(TPersistent)
  private
    FDimensions: Integer = 1;
    FSize: Integer; // Länge je Dimension
    FFirstDimesion: TVarDimListDimension; // hält ggf. weitere TDimension Objekte. Die letzte Ebene hält die eigentlichen Daten
  public
    property Demensions read FDimensions write SetDimensions;
    property Size read FSize write SetSize;
    Items[Index: array of Integer] read getItem write SetItem; default; // Length(Index) = FDimensions; leider muss das zur Laufzeit geprüft wedren, aber anders gehts nicht; auch der Rage-Test muss hier gemacht wedren...
  end;
mfg

Christian

Dax 9. Feb 2008 16:07

Re: dynamisches array wenn array eigenes objekt
 
Zitat:

Zitat von wicht
Delphi-Quellcode:
procedure TMyHauptklasse.bla;
begin
  SetLength(Feld,6,6);
end;
müsste eher

Delphi-Quellcode:
procedure TMyHauptklasse.bla;
var
  i: Integer;
begin
  SetLength(Feld, 6);
  for i := 0 to High(Feld) do
    SetLength(Feld[i], 6);
end;
sein.

Schlicht und ergreifend falsch.


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