![]() |
Zurückgeben von Arrays
Morgen.
Ich habe ein Array und gebe das in einer Funktion zurück. (Result:=MyArray;) Wird das dabei per CallByReference oder per CallByValue übergeben? |
Re: Zurückgeben von Arrays
CallByReference
|
Re: Zurückgeben von Arrays
Gibts eine Array-Kopierfunktion?
|
Re: Zurückgeben von Arrays
Nennt sich Copy().
|
Re: Zurückgeben von Arrays
Zitat:
|
Re: Zurückgeben von Arrays
Ich hab grad gemerkt, dass mein Code eh falsch war und ich das Array sowieso nicht kopieren kann.
|
Re: Zurückgeben von Arrays
übergebe das ausgabe-array mit als parameter...so wird das z.B. bei stringlisten gehandhabt.
zur veranschaulichung:
Delphi-Quellcode:
edit:evtl. musst du den parameter als var definieren (wegen setlength)
procedure blah(eingabe:string;ausgabe:array of char);
begin setlength(ausgabe,length(eingabe)); for i:=1 to length(eingabe) do ausgabe[i]:=s[i]; end;
Delphi-Quellcode:
Gruß Frank
procedure blah(eingabe:string; var ausgabe:array of char);
|
Re: Zurückgeben von Arrays
wobei das erste char element im array dann leer bleibt;
kann man doch dann auch so machen:
Delphi-Quellcode:
for i:=0 to length(eingabe)-1 do
ausgabe[i] := eingabe[i+1]; |
Re: Zurückgeben von Arrays
Zitat:
denn dieses würde außerhalb des Arrays landen. :warn: PS: /me würde es so machen ;)
Delphi-Quellcode:
Move(eingabe[1], ausgabe[0], Length(eingabe));
|
Re: Zurückgeben von Arrays
Wenn eine Prozedur/Funktion/Methode ein Array zurückliefern soll, muss es als 'Var' deklariert sein, und nicht nur eventuell, sondern garantiert.
'Var' bedeutet, das Änderungen am Parameter dem Aufrufer nicht verborgen bleiben. Ohne das 'Var' wird vor dem Aufruf eine Kopie angelegt. Die aufgerufene Methode pfuscht dann in der Kopie herum. Nach Beendigung der Methode sind alle Änderungen futsch. Um nun Arrays als Rückgabeparameter zu deklarieren, gibt es zwei Möglichkeiten: Entweder man vereinbart einen Datentypen (a) oder man verwendet offene Arrays (b). Möglichkeit a:
Delphi-Quellcode:
oder b:
Type
TMyArray = Array [0..9] Of TSomething; ... Procedure MyProcedure (Var aMyArray : TMyArray); Begin ... End; ... Var a : TMyArray; Begin MyProcedure (a); End;
Delphi-Quellcode:
Natürlich geht auch c:
Procedure MyProcedue (Var aMyArray : Array Of TSomething);
Begin ... End; ... Var a : Array [0..4] Of TSomething; b : Array [0..999] Of TSomething; Begin MyProcedure (a); MyProcedure (b); End;
Delphi-Quellcode:
Variante c ist kein Standard-Pascal aber legitim. Ich finde häßlich, aber das ist Geschmackssache.
Type
TMyArray = Array [0..9] Of TSomething; ... Function MyFunction : TMyArray; Begin Result[0] := Foobar; End; ... Var a : TMyArray; Begin a := MyFunction; End; |
Re: Zurückgeben von Arrays
Zitat:
Aufpassen musst Du bei Array-Parametern noch woanders, nämlich beim Schieben auf den Stack. So wird z.B. bei Array of Variant bei einem Array mit einem Stringmember nicht ein String, sondern ein Array of Char im Stack abgelegt... komm da mal einer drauf. Die Prüfung, was zu tun ist, prüft tatsächlich erst, obs ein Array ist (und ein String sagt da sofort ja) und dann erst den Typen der Elemente. Sobald mehr als ein Member im Array ist macht ers wieder richtig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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-2025 by Thomas Breitkreuz