AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Arrays Parameterübergabe

Ein Thema von martin_ · begonnen am 5. Apr 2009 · letzter Beitrag vom 5. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#1

Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:04
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.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:12
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.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:25
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
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#4

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.345 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:44
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.

Ob es sinnvoll ist, ist nochmal was anderes, aber dass es geht, hast du dort doch gesehen, oder?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#6

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 10:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 11:01
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 11:42
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 ? 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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 11:45
Zitat von xZise:
Zu Detlef: Was macht den sx2008 anders ?
Er gibt kein Result zurück, daher hab ich gleich eine Prozedur draus gemacht .
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Dynamische Arrays Parameterübergabe

  Alt 5. Apr 2009, 12:13
xZise, ab Delphi 2009 kannst du dir doch eine Integerlist selber bauen mit TList<Integer>
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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