AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Funktions-Parameter record: Call-by-value??

Ein Thema von Bambi · begonnen am 15. Jun 2015 · letzter Beitrag vom 15. Jun 2015
Antwort Antwort
Bambi

Registriert seit: 16. Okt 2009
26 Beiträge
 
Delphi XE5 Professional
 
#1

Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 11:02
Delphi-Version: 5
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
Stephan
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.946 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 11:07
Record ist keine Klasse!

Delphi-Quellcode:
type
  TFoo = Record
           A : Array[1..2000] of Byte;
         end;
var
  Foo : TFoo;
Foo ist der direkte Speicher und nicht ein Zeiger...

Wenn Du eine Procedure aufrufst und nicht VAR AFoo : TFoo an gibst ist es immer ein Call by Value

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.963 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 11:22
Wenn Du eine Procedure aufrufst und nicht VAR AFoo : TFoo an gibst ist es immer ein Call by Value
Out und const zählen nicht (abgesehen davon, dass die im vorliegenden Fall nichts bringen)?
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 uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.681 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 12:43
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 procedure Blubb(AForm: TForm) ). 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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.946 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 14:04
(also z.B. AForm in procedure Blubb(AForm: TForm) ). 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.
OK um es einfacher aus zu drücken...

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.963 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 15:25
Einspruch!
Delphi-Quellcode:
procedure NachWas1(AClass: TSomeClass);
begin
  AClass := nil;
end;
vs.
Delphi-Quellcode:
procedure NachWas2(var AClass: TSomeClass);
begin
  AClass := nil;
end;
Wo ist der Unterschied?
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 BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 15:26
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.

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?
Deine Überlegung ist vermutlich: Der Event-Handler soll nicht an dem Feld herummanipulieren dürfen, also möchte ich call-by-value.
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 const . Sollte eine Kopie nötig sein, wird der Event-Handler das schon machen.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
3.946 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 15:41
Dein Beispiel hat nix mir meiner Antwort zu tun...

Gemäß meiner Antwort wäre es eher so...

Delphi-Quellcode:
Procedure Foo(AFoo : TFoo);
begin
  Fillchar(AFoo,100,#0);
end;

Procedure Foo(Var AFoo : TFoo);
begin
  Fillchar(AFoo,100,#0);
end;
Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.963 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Funktions-Parameter record: Call-by-value??

  Alt 15. Jun 2015, 15:43
Dann hat Deine Antwort aber wiederum nichts mit dem darin enthaltenen Zitat zu tun
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
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 12:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf