Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays Parameterübergabe (https://www.delphipraxis.net/132049-dynamische-arrays-parameteruebergabe.html)

martin_ 5. Apr 2009 10:04


Dynamische Arrays Parameterübergabe
 
Hallo,
die Funktion "maches" soll als Ergebnis ein dynamisches Array liefern. Die Anzahl der Einträge wird in der Funktion dynamisch festgelegt.
Delphi-Quellcode:
type
  ValueArray = Array of String;

  TForm37 = class(TForm)
  private
    { Private-Deklarationen }
  public
    procedure callmaches;
    function maches():ValueArray;
    { Public-Deklarationen }
  end;
Delphi-Quellcode:
function TForm37.maches: ValueArray;
begin
  setLength(ValueArray,1);
  ValueArray[0] := 'Eintrag0';
  result:= ValueArray;
end;
Mein Problem liegt in der Festlegung der Länge von Array "ValueArray". Es würde funktionieren, wenn die Definition innerhalb der Funktion steht, nur so klappt die Rückgabe nicht.
Meine Frage lautet, wie ich einen dynamischen Datentyp erstelle und in einer Funktion übergebe.

quendolineDD 5. Apr 2009 10:12

Re: Dynamische Arrays Parameterübergabe
 
Delphi-Quellcode:
type
  TValueArray = array of String;

  function DoIt(const length : integer) : TValueArray;
  var I : integer;
  begin
    SetLength(Result, length);
    for I := 0 to High(Result) do
      Result[I] := 'Eintrag'+ IntToStr(I);
  end;

var S : TValueArray;
begin
  S := DoIt(5);
end;
Edit:
Will dich damit mal nicht im dunklen lassen.
Also High() gibt die Länge -1 zurück.

sx2008 5. Apr 2009 10:25

Re: Dynamische Arrays Parameterübergabe
 
Ich würde dir raten, auf dynamische Arrays zum Zwecke der Datenübergabe zu verzichten.
In deinem Fall könntest du einfach eine StringListe (Klasse TStringList bzw. TStrings verwenden).
Delphi-Quellcode:
TForm37 = class(TForm)
private
  { Private-Deklarationen }
public
  procedure callmaches;
  procedure maches(liste:TStrings);
  { Public-Deklarationen }
end;

procedure TForm37.maches(liste:TStrings): ValueArray;
begin
  liste.Clear;
  liste.Add('Eintrag0');
  liste.Add('Eintrag1');
end;
Das Problem, ist dass dynamische Arrays häufig benutzt werden, obwohl sie in dem aktuellen Kontext eher nachteilig sind.
Das betrifft vorallem Anfänger, die die (besseren) Alternativen zu einem dyn. Array noch nicht kennen.
http://blogs.msdn.com/ericlippert/ar...t-harmful.aspx

martin_ 5. Apr 2009 10:39

Re: Dynamische Arrays Parameterübergabe
 
Das bedeutet bei einem dynamischen Array kann nicht das gesamte Array übergeben werden, sondern immer nur die einzelnen Einträge, die später wieder in eines gepackt werden müssen? Also im Vergleich zu einem Objekt, wo ich das gesamte Objekt zurückschicken kann.

jaenicke 5. Apr 2009 10:44

Re: Dynamische Arrays Parameterübergabe
 
Zitat:

Zitat von martin_
Das bedeutet bei einem dynamischen Array kann nicht das gesamte Array übergeben werden, sondern immer nur die einzelnen Einträge, die später wieder in eines gepackt werden müssen? Also im Vergleich zu einem Objekt, wo ich das gesamte Objekt zurückschicken kann.

Du hast offenbar das Beispiel von quendolineDD übersehen. :gruebel:

Ob es sinnvoll ist, ist nochmal was anderes, aber dass es geht, hast du dort doch gesehen, oder?

martin_ 5. Apr 2009 10:57

Re: Dynamische Arrays Parameterübergabe
 
Das es funktioniert und wie es funktioniert ist klar. Es ist für mich nur nicht nachvollziehbar, warum nicht ein komplettes Array übergeben werden kann, wie es bei objektorientierter Programmierung möglich ist.

DeddyH 5. Apr 2009 11:01

Re: Dynamische Arrays Parameterübergabe
 
Generell sollte man allerdings Speicher auf der Ebene freigeben, auf der er angefordert wurde, sonst steigt die Gefahr eines Memory-Leaks. D.h. statt ein Speicher für ein dynamisches Objekt innerhalb einer Funktion anzufordern und dieses dann als Rückgabewert zu definieren, könnte man es auch als Parameter übergeben. Also z.B. so (mit einem TStrings-Objekt statt eines Arrays):
Delphi-Quellcode:
procedure DoIt(const List: TStrings; length : integer);
var I : integer;
begin
  List.Clear;
  for I := 0 to length - 1 do
    List.Add('Eintrag'+ IntToStr(I));
end;

var S : TStringlist;
begin
  S := TStringlist.Create;
  try
    DoIt(S,5);
  finally
    S.Free;
  end;
end;

xZise 5. Apr 2009 11:42

Re: Dynamische Arrays Parameterübergabe
 
Hallo,

Zu dem Problem von dir: Du hast ValueArray durch deine Definition als Typ definiert. Das heißt es gibt den Typ ValueArray wie es zum Beispiel den Typ ... Integer oder String gibt.

Delphi-Quellcode:
type
  TMyArray = array of string;
 
  TMyClass = class
    MyVarA : TMyArray;
    MyVarB : array of string;
  end;
In dieser Klasse sind MyVarA und MyVarB ähnlich (wobei nicht 100%ig austauschbar). Das heißt du kannst ValueArray nicht als Variable behandeln, sondern wie bereits in #2 beschrieben die Variable "Result".

Zu Detlef: Was macht den sx2008 anders :mrgreen: ? Aber ich muss den beiden beipflichten, dass ich da auch eine TStringList verwende ;) Sie ist einfach bequemer. Warum gibt es den keine TIntegerList o.ä. :( ?

MfG
xZise

DeddyH 5. Apr 2009 11:45

Re: Dynamische Arrays Parameterübergabe
 
Zitat:

Zitat von xZise
Zu Detlef: Was macht den sx2008 anders :mrgreen: ?

Er gibt kein Result zurück, daher hab ich gleich eine Prozedur draus gemacht :zwinker:.

quendolineDD 5. Apr 2009 12:13

Re: Dynamische Arrays Parameterübergabe
 
xZise, ab Delphi 2009 kannst du dir doch eine Integerlist selber bauen mit TList<Integer>


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.
Seite 1 von 2  1 2      

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