Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung) (https://www.delphipraxis.net/169159-var-out-const-paramter-stack-ansicht-compiler-umsetzung.html)

NickelM 3. Jul 2012 08:12

Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung)
 
Hallo zusammen,

Wie oben schon beschrieben geht es um die Wörtchen Var, Out und Const, die man vor einem Paramter setzen kann. Mich interessiert mal, was der Compiler aus diesen Paramter intern, also wenn man sozusagen den "Stack" anschauen würde, macht.
Ich meine damit, in welchen "Typ" bzw. in welcher Form legt der Compiler dies eigentlich dann ab.
Es interessiert mich deshalb, dass ich weis, wie man eine Delphi-Funktion, die in einer Dll ist, in einer anderen Sprache aufrufen müsste, bzw. wie ich dies übergeben muss.

Ein Beispiel:
Var: Ich weis das wenn man Var für einem Paramter schreibt, der Compiler das in einen Pointer umsetzt.
Eigentlich wird also ein Pointer übergeben und der Compiler dereferenziert dann diesen Pointer.
Zumindest scheint es mir so, wenn ich nämlich in C++ einen Pointer auf den Typ übergebe und einen Var Parameter habe, bekomm ich den eigentlichen Typ.

So das ist aber das einzige, was ich weis. Wie wird out und Const eigentlich umgesetzt?
Oder machen die am eigentlichen Typ keine änderung?

P.S. : Sorry wenn ich so dumm frage, aber ich wusste nicht wie ich danach googlen bzw. ob es eigentlich irgendwo steht bzw. erklärt wird :oops:

Gruß NickelM

shmia 3. Jul 2012 09:58

AW: Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung)
 
out wird genau gleich wie var behandelt;
nur dass der Compiler nicht merkert wenn die Variable vor Aufruf der Funktion uninitialisiert ist.

Bei const hängt es vom Datentyp ab, was der Compiler daraus macht.
Normalerweise wird er den Parameter wie eine Wertübergabe behandeln.
Bei Records und Mengen kann der Compiler sich aber auch für eine Übergabe per Zeiger entscheiden, da ja der Code in der Funktion keine Veränderungen am Parameter vornehmen darf.

Bei Daten, die einer Referenzzählung unterliegen (dynamische Arrays, Strings, Interfaces), hat die Übergabe per const den Vorteil dass die Übergabe schneller wird.

brechi 3. Jul 2012 09:59

AW: Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung)
 
Var/Out/Const sind alles Pointer auf die Variable. Nur der Delphi-Compiler kann/könnte zusätzliche Überprüfungen machen und ggf. meckern:

VAR = Variable muss vorher initialisiert werden
OUT = Variable darf vorher nicht initialisiert werden
CONST = Variable in der Funktion kann nicht abgeändert werden

Wenn es erlaubt ist auch NULL/nil an die Funktion zu übergeben, dann solltes man direkt die Variable als Pointer uebergeben, d.h. Deklaration im Header als z.B. PInteger und Übergabe als @variablenname

NickelM 3. Jul 2012 10:20

AW: Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung)
 
Gut, also wie sich das anhört sind dieses meistens Dinger, die im Einsatz z.b. bei einer Dll nicht wirklich Auswirkungen hat. Wenn man "Standardtypen" wie z.b. Integer, PAnsiChar kann man mit Var und out arbeiten. Const ist da, nach euren Statements relativ unnötig. Wenn man feststellen will, ob der Pointer <> nil ist, halt direkt Pointer nehmen. Aber das ist ja dan logisch :-D
Arrays verwende ich sowieso nicht in Funktionen. Lieber Pointer und dan so hinterlegen, wie einen statischen Array und Länge angeben (so wie es die WinAPIs auch machen).

Danke euch für die Erklärung.

Gruß NickelM

Iwo Asnet 3. Jul 2012 10:28

AW: Var, Out, Const Paramter - Stack Ansicht (Compiler-Umsetzung)
 
Verwende "Var" oder eben nix, um eine Prozedur in einer DLL zu exportieren. Denke auch an die Aufrufkonvention.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz