![]() |
Delphi-Version: 5
Funktions-Parameter record: Call-by-value??
Hallo,
ich hab eine Klasse erstellt, die einen externen Event (Deklaration: "procedure OnEvent(Sender:TObject; Data: TMyDataRecord)") aufruft, um Daten an mein Hauptptogramm zu übergeben (Datenquelle ist ein UDP-Client, das Ereignis kommt also irgendwann...). Meine Frage: die Daten werden ja in einem Record übergeben. Geschieht das per Call-On-Value (also wird der Record kopiert) oder per Call-On-Reference (nur die Referenz auf den Record wird übergeben). Das Problem ist, dass ich im private-Bereich der Klasse ein Feld "FData: TMyDataRecord" deklariert hab, das die Daten sammelt und sobald alles vollständig ist das Event aufruft: "OnEvent(self, FData)". Call-On-Value wäre also angebracht. BTW: Kann ich Call-On-Value nicht mit "const" vor dem Parameter erzwingen? Danke und Gruß Stephan |
AW: Funktions-Parameter record: Call-by-value??
Record ist keine Klasse!
Delphi-Quellcode:
Foo ist der direkte Speicher und nicht ein Zeiger...
type
TFoo = Record A : Array[1..2000] of Byte; end; var Foo : TFoo; Wenn Du eine Procedure aufrufst und nicht VAR AFoo : TFoo an gibst ist es immer ein Call by Value Mavarik |
AW: Funktions-Parameter record: Call-by-value??
Zitat:
|
AW: Funktions-Parameter record: Call-by-value??
Parameter in Delphi werden immer by value übergeben, wenn man nicht var, out oder const verwendet. Das gilt für Skalare (Integer und so) ebenso wie für Records, und insbesondere auch für Klassenreferenzen (also z.B. AForm in
Delphi-Quellcode:
). Bei letzteren entsteht nur gelegentlich Verwirrung, wenn jemand die Instanz der Klasse und die Referenz darauf verwechselt: Da die Referenz (per Wert!) übergeben wird, kannst du die Instanz verändern.
procedure Blubb(AForm: TForm)
|
AW: Funktions-Parameter record: Call-by-value??
Zitat:
Wenn eine Klasse übergeben wird, wird "nur" der Zeiger(Pointer) übergeben... Ob das nun per Referenz oder per Value ist, ist dabei egal, da der Pointer ja immer auf den gleichen Speicherbereich zeigt... Mavarik |
AW: Funktions-Parameter record: Call-by-value??
Einspruch!
Delphi-Quellcode:
vs.
procedure NachWas1(AClass: TSomeClass);
begin AClass := nil; end;
Delphi-Quellcode:
Wo ist der Unterschied?
procedure NachWas2(var AClass: TSomeClass);
begin AClass := nil; end; |
AW: Funktions-Parameter record: Call-by-value??
Da kann man im Prinzip lange darüber streiten, ob Zeiger Referenzen oder Values sind. Letztendlich funktioniert die Übergabe von Parametern auf Instruktionsebene immer nur by-value; der Prozessor arbeitet erst einmal nur mit Werten. Alles darüber sind "nur" semantische Unterschiede, wenn auch nützliche. An der Stelle sollten wir uns aber nicht festbeißen.
Zitat:
Nun das Problem dabei: Wenn dein Record groß ist, dann wird das Kopieren des Records aufwendig. Was du tatsächlich möchtest, das ist eine schreibgeschützte Referenz auf das Record; und die bekommst du mit
Delphi-Quellcode:
. Sollte eine Kopie nötig sein, wird der Event-Handler das schon machen.
const
|
AW: Funktions-Parameter record: Call-by-value??
Zitat:
Gemäß meiner Antwort wäre es eher so...
Delphi-Quellcode:
Mavarik
Procedure Foo(AFoo : TFoo);
begin Fillchar(AFoo,100,#0); end; Procedure Foo(Var AFoo : TFoo); begin Fillchar(AFoo,100,#0); end; |
AW: Funktions-Parameter record: Call-by-value??
Dann hat Deine Antwort aber wiederum nichts mit dem darin enthaltenen Zitat zu tun :tongue:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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