![]() |
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:
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.
function TForm37.maches: ValueArray;
begin setLength(ValueArray,1); ValueArray[0] := 'Eintrag0'; result:= ValueArray; end; Meine Frage lautet, wie ich einen dynamischen Datentyp erstelle und in einer Funktion übergebe. |
Re: Dynamische Arrays Parameterübergabe
Delphi-Quellcode:
Edit:
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; Will dich damit mal nicht im dunklen lassen. Also High() gibt die Länge -1 zurück. |
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:
Das Problem, ist dass dynamische Arrays häufig benutzt werden, obwohl sie in dem aktuellen Kontext eher nachteilig sind.
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 betrifft vorallem Anfänger, die die (besseren) Alternativen zu einem dyn. Array noch nicht kennen. ![]() |
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.
|
Re: Dynamische Arrays Parameterübergabe
Zitat:
Ob es sinnvoll ist, ist nochmal was anderes, aber dass es geht, hast du dort doch gesehen, oder? |
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.
|
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; |
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:
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".
type
TMyArray = array of string; TMyClass = class MyVarA : TMyArray; MyVarB : array of string; end; 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 |
Re: Dynamische Arrays Parameterübergabe
Zitat:
|
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 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz