Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktionsrückgabewert: Array (https://www.delphipraxis.net/121246-funktionsrueckgabewert-array.html)

Roachford 25. Sep 2008 14:12

Re: Funktionsrückgabewert: Array
 
Zitat:

Zitat von oki
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? :gruebel:

Nein, kann er gar nicht, weil dann müsste er einen Copy Constructor haben bzw. eine feste und automatisch erweiterte Funktion wie Assign() haben. Soviel Compilermagic hat Delphi nicht und es würde durch die vielen Zeigertypen (ob versteckt oder offensichtlich) in der Delphi Sprache nicht viel bringen, weil die wären auch mit einem Copy Constructor nil danach. Da hätte er dann noch mehr Probleme zu wissen ob du bei einem Zeigertyp den gleichen Zeiger oder eine neuen Zeiger auf eine Kopie haben willst. Aus dem gleichen Grund handhabt es C++ genauso, wobei es dort mit den reinen Objekten eh nötig ist.

oki 25. Sep 2008 15:14

Re: Funktionsrückgabewert: Array
 
Dann versteh ich aber nicht, warum Delphi ein dynamisches Array als Parameter kopieren soll.

Gruß

Roachford 25. Sep 2008 15:40

Re: Funktionsrückgabewert: Array
 
Dein Objektinstanzenzeiger wird intern kopiert, nur das Objekt kann er nicht kopieren. Beispiel:

Delphi-Quellcode:
procedure Test(AObject: TObject);
begin
  AObject := nil;
end;

procedure Anderes;
var
  lInstance: TObject;
begin
  lInstance := TObject.Create;
  try
    Test(lInstance);
   
    if lInstance = nil then
      WriteLn('nicht kopiert')
    else
      WriteLn('Instanzenzeiger wurde kopiert & Kopie wurde zurück gesetzt');

  finally
    lInstance.Free;
  end;
end;

oki 25. Sep 2008 15:47

Re: Funktionsrückgabewert: Array
 
Ja klar, wenn ich den Parameter nicht als var übergebe, dann bleibt der Zeiger nach außen natürlich "konstant". Ich kann den Inhalt eines Objektes in der Procedure ändern, weil ich auf die enthaltenen Daten zugreife auf dessen Struktur der Zeiger der Instanz zeigt.
Ich dachte nur, dass Delphi das mit allen Zeigern so macht und ein dynamisches Array ist halt ein Zeiger auf den Speicher.

Gruß oki

Roachford 25. Sep 2008 15:52

Re: Funktionsrückgabewert: Array
 
Zitat:

Zitat von oki
Ich dachte nur, dass Delphi das mit allen Zeigern so macht und ein dynamisches Array ist halt ein Zeiger auf den Speicher.

Macht er doch auch. Die TObject Deklaration impliziert ja schon einen Zeiger. Somit kannst du das Beispiel zuvor auch so umbauen, dass du TObject z.B. durch PByte ersetzt, das Verhalten wäre das gleiche.

oki 25. Sep 2008 15:58

Re: Funktionsrückgabewert: Array
 
oh, ich glaub, jetzt reden wir aneinander vorbei. Ich wiederhol noch mal, was ich verstanden habe.

Wird ein dyn. Array in einer Procedure nicht als var-Parameter übergeben, so kopiert Delphi intern alle Daten des Arrays bei der Übergabe, was zu einer erheblichen Anzahl an Operationen führen kann.

Und genau das versteh ich nicht. Die Übergabe der Adresse sollte doch reichen, wie bei der Objectinstanz. :gruebel:
Mir gehts hier also ausschließlich um das Array, nicht um die Objekte.

Gruß

Roachford 25. Sep 2008 16:25

Re: Funktionsrückgabewert: Array
 
Zitat:

Zitat von oki
Wird ein dyn. Array in einer Procedure nicht als var-Parameter übergeben, so kopiert Delphi intern alle Daten des Arrays bei der Übergabe, was zu einer erheblichen Anzahl an Operationen führen kann.

Nein, tut es nicht.

Roachford
Wenn du var weglässt, erstellt dir Delphi vor Änderungen eine Kopie des Arrays und somit setzt du höchstens die Kopie auf 0.


Das "vor Änderungen" bezieht sich nicht auf den Array Inhalt sondern auf das Array selbst.

Roachford
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.

oki 25. Sep 2008 17:56

Re: Funktionsrückgabewert: Array
 
Ja, dann haben wir wirklich aneinander vorbei gesprochen. Ich meinte eigentlich die Inhalte.

Dann sollte das jetzt geklärt sein. :mrgreen:

Gruß oki


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

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