AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Funktionsrückgabewert: Array

Ein Thema von violinenspieler1000 · begonnen am 24. Sep 2008 · letzter Beitrag vom 25. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2   
violinenspieler1000

Registriert seit: 22. Apr 2008
15 Beiträge
 
#1

Funktionsrückgabewert: Array

  Alt 24. Sep 2008, 14:59
Hallo,

ich möchte eine Funktion schreiben, die mir als Rückgabewert ein (mehrdimensionales) Array liefert.

Geht sowas? Wie kann man das relaisieren?


Thomas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Funktionsrückgabewert: Array

  Alt 24. Sep 2008, 15:01
Das müsste gehen, wenn Du das Array als Typ deklarierst und die Funktion dann diesen Typ zurückgibt.
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
24. Sep 2008, 17:20
Dieses Thema wurde von "Jelly" von "Klatsch und Tratsch" nach "Object-Pascal / Delphi-Language" verschoben.
Klatsch & Tratsch ist das aber noch nicht
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Funktionsrückgabewert: Array

  Alt 24. Sep 2008, 17:44
Zitat von violinenspieler1000:
...Geht sowas?...
Was spricht dagegen es einfach zu probieren?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 04:15
Zitat von violinenspieler1000:
ich möchte eine Funktion schreiben, die mir als Rückgabewert ein (mehrdimensionales) Array liefert.
Kannst du mal dein ursprüngliches Problem schildern?
Es ist günstig, mehrdimensionales Arrays in einer Klasse zu verpacken.
Das hat den Vorteil, dass du alle Funktionen, die sich auf das Array beziehen in der Klasse unterbringen kannst.
Insbesondere Sparse-Arrays lassen sich nur mit Klassen sinnvoll implementieren.
Genaueres kann man aber erst sagen, wenn man weiss, was du vorhast.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 07:38
Moin,

bei der Übergabe in Funktionen/Proceduren werden Arrays angegeben wie dynamische Arrays. Dabei sollte es egal sein, ob ein- oder mehrdimensional.
Procedure SetArr(Value : Array of Integer); Die Methode mit der Typdeklaration wurde ja schon benannt.
Delphi-Quellcode:
type
  TDeclArray = Array [0..Max] of Integer;

Procedure SetArr(Value : TDeclArray);
Im ersten Fall kannst Arrays beliebiger Länge übergeben, im Zweiten nur vom deklarierten Typ.
Achte bei dem Hinweis für die Klassen darauf, dass du Arrays nicht im published-Teil als Typ angegen kannst.

Gruß oki

edit: Sorry, imho gilt das natürlich auch für Rückgabewerte von Funktionen. Im Fall Published sind natürlich propertys gemeint.
42
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#7

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 13:56
Dynamische Arrays als Rückgabewert sind programmiertechnisch mehr als ineffizient, da der Rückgabewert immer kopiert wird. Es lohnt sich somit definitiv nicht, wenn dann eher als VAR Parameter übergeben und dann in der Funktion füllen.

ABER: dynamische Arrays etc. sind nur noch an wenigen Stellen sinnvoll einsetzbar, da die Nachteile überwiegen:

Vorteile:
- Member sind vom direkten Typ

Nachteile:
- man muss genau sein beim Handling, vor allem bei Übergaben, da es sonst leicht und viel kopiert wird von Delphi und somit der Speicherverbrauch steigt
- Erhöhter Aufwand beim entfernen einzelner Member
- Man explizit drauf achten by reference Übergaben zu deklarieren, damit man das Array in Funktionen ändern kann, ansonsten arbeitet man auf einer Kopie

TList und deren Derivate ersetzen die dynamischen Arrays mit einer z.T. effizienteren Verwaltung (löschen eines Elementes schiebt in TList nur die Zeiger, in einem Array Of müssen die Elemente, also der Inhalt, bewegt werden, was meist ungemein grösser ist)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 14:03
Hi,

da ich mir jetzt nicht sicher bin formuliere ich es mal als Aussage und Frage.

Dynamische Arrays sind imho Zeiger auf Speicherbereiche. Das Setzen einer Variable auf nil die ein dynamisches Array hält reicht aus um das Array zu "lösche".
Somit sollte eine Übergabe eines dyn. Arrays in einer Procedure doch die Übergabe eines Zeigers sein. Ist dann überhaupt eine Deklaration als var-Parameter notwendig?

Das es bei der Übergabe von dyn. Arrays in Procedure und Funktionen zum delphiinternen kopieren kommt ist mir so neu. Zur Not habe ich wieder was dazu gelernt.

Gruß oki
42
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#9

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 14:42
Zitat von oki:
Dynamische Arrays sind imho Zeiger auf Speicherbereiche.
Korrekt.

Zitat von oki:
Das Setzen einer Variable auf nil die ein dynamisches Array hält reicht aus um das Array zu "lösche".
Dabei greift hier Compilermagic von Delphi, welche implizit ein SetLength(x, 0) damit aufruft und zuvor, wenn nötig, das Array finalisiert.

Zitat von oki:
Somit sollte eine Übergabe eines dyn. Arrays in einer Procedure doch die Übergabe eines Zeigers sein. Ist dann überhaupt eine Deklaration als var-Parameter notwendig?
Wenn du var weglässt, erstellt dir Delphi vor Änderungen eine Kopie des Arrays und somit setzt du höchstens die Kopie auf 0.

Mit dem var hingegen legt Delphi dir keine Kopie an sondern übergibt dir den originalen Zeiger auf das Array vom Aufrufer. Somit kannst du das Array auch verändern.

Zitat von oki:
Das es bei der Übergabe von dyn. Arrays in Procedure und Funktionen zum delphiinternen kopieren kommt ist mir so neu. Zur Not habe ich wieder was dazu gelernt.
Ich müsste hier vllt. nochmal explizit darauf hinweisen, dass ich die Veränderung des Arrays meine - also von NIL setzen bist SetLength(). Ein Veränderung der Arrayinhalte ohne Grössenänderung ist natürlich ohne var möglich, da er die Daten an der Stelle direkt editiert, welche der Zeiger bestimmt.

Delphi-Quellcode:
program ArrayTest;

{$APPTYPE CONSOLE}

uses
  Types,
  SysUtils;

procedure ChangeContent(AList: TIntegerDynArray);
var
  i: integer;
begin
  for i := low(AList) to high(AList) do
    AList[i] := 10 - i;
end;

procedure ChangeArray(AList: TIntegerDynArray);
var
  i: integer;
begin
  SetLength(AList, 4);
  for i := low(AList) to high(AList) do
    AList[i] := 50 + i;
end;

procedure Test;
var
  lTestCaller: TIntegerDynArray;
  lInt, i: integer;
begin
  SetLength(lTestCaller, 3);

  for i := low(lTestCaller) to high(lTestCaller) do
    lTestCaller[i] := Succ(i);

  WriteLn('content prior ChangeContent():');
  for lInt in lTestCaller do
    WriteLn(lInt);
  WriteLn;

  ChangeContent(lTestCaller);

  WriteLn('content after ChangeContent() & prior ChangeArray():');
  for lInt in lTestCaller do
    WriteLn(lInt);
  WriteLn;

  ChangeArray(lTestCaller);

  WriteLn('content after ChangeArray():');
  for lInt in lTestCaller do
    WriteLn(lInt);
end;

begin
  try
    Test;

    ReadLn;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Ausgabe:
Zitat von Command Console:
content prior ChangeContent():
1
2
3

content after ChangeContent() & prior ChangeArray():
10
9
8

content after ChangeArray():
10
9
8
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 14:53
ok,

somit ist das Verändern der Inhalte eines dynamischen Arrays innerhalb der Procedure ohne var-Übergabe genauso möglich wie mit var-Übergabe. Um das interne kopieren zu vermeiden, macht es Sinn den Parameter mittels var zu übergeben (was ja eigentlich generell die Übergabe eines Zeigers bewirkt).

Damit ergibt sich aber automatisch, dass Delphi intern die Parameterübergabe für unterschiedliche Typen auch unterschiedlich händelt. Oder wird bei der Übergabe einer Objectinstanz auch intern kopiert?

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf