AW: Procedure vs Function, Vor- und Nachteile
Delphi-Quellcode:
function Test: Integer;
begin Result := Result + 1; end;
Delphi-Quellcode:
Genau das sagte ich doch.
function Test: string; // procedure Test(var Result: string);
begin Result := Result + 'a'; end; Bei Ersten kommt die Fehlermeldung, da der Integer wirklich als lokale Variable existiert, als Result in EAX zurückgeliefert und anschließend der äußeren Variable zugewiesen wird. Während beim String (vom Compiler speicherverwalteter Zeigertyp) keine lokale Variable existiert und direkt in den referenzierten Parameter geschrieben wird.
Delphi-Quellcode:
function Test: Integer;
begin Result := Result + 1; raise Exception.Create(''); end; i := 123; try i := Test; except end; ShowMessage(i.toString); // immer 123
Delphi-Quellcode:
Hängt davon ab, ob der Compiler für das Result automatisch eine lokale Variable erstellt und anschließend umkopiert oder direkt das Result nimmt.
function Test: string; // procedure Test(var Result: string);
begin Result := Result + 'a'; raise Exception.Create(''); end; s := 'x'; try s := Test; except end; ShowMessage(S); // je nach Compileroptiomierung auch mal 'xa' und nicht 'x'
Delphi-Quellcode:
In einer Schleife mehrfach Test aufgerufen bekommt die Funktion aber praktisch immer wieder die selbe Variable rein.
s := 'x';
try Test(temp); // temp := Test; s := temp; except end; // oder s := 'x'; try Test(s); // s := Test; except end; |
AW: Procedure vs Function, Vor- und Nachteile
Zitat:
Danke für den Tipp, ich habe auch probiert Ihn umzusetzen, nun hab ich alle Meldungen On/Off durch mit dem Resultat wie himitsu schrieb, es gibt keine Warnung für das
Delphi-Quellcode:
Beispiel.
procedure Test(var Result: string); begin Result := Result + 'a'; end;
Dennoch Danke! Auch nochmal an himitsu für die vielen Beispiele und Erklärungen! |
AW: Procedure vs Function, Vor- und Nachteile
Zitat:
Delphi-Quellcode:
ist genau wie (meistens)
var
Delphi-Quellcode:
ein "pass by reference", also stimmt das schon mit der Vermeidung von unnötigen Kopieroperationen. Da ein Output Parameter ja aber gewünscht ist, macht
const
Delphi-Quellcode:
hier keinen Sinn :gruebel:
const
Zitat:
Delphi-Quellcode:
ist runtergebrochen auf den generierten Code exakt gleichwertig zu
var
Delphi-Quellcode:
(auch wenn out gegebenenfalls aus Gründen der Übersichtlichkeit zu bevorzugen ist).
out
Code:
005CE2D4 E8BFFFFFFF call Beispiel1 // function
Unit2.pas.48: Beispiel2(X); 005CE2D9 8D45FB lea eax,[ebp-$05] 005CE2DC E8C7FFFFFF call Beispiel2 // procedure mit var Unit2.pas.49: Beispiel3(X); 005CE2E1 8D45FB lea eax,[ebp-$05] 005CE2E4 E8CFFFFFFF call Beispiel3 // procedure mit out Zitat:
|
AW: Procedure vs Function, Vor- und Nachteile
Prozedur für Füllen von Objekten ala Listen, wo es als Result oft ungünstig ist.
Und Prozedur hat eher Nachteile, denn du brauchst da immer eine "selbstdefinierte" Variable und man kann es nicht direkt weitergeben, z.B. als Parameter an eine andere Prozedur/Funktion oder für's Zusammenrechnen mehrerer Werte ohne Zwischenvariablen. |
AW: Procedure vs Function, Vor- und Nachteile
VAR und OUT ist praktisch das Gleiche, außer dass bei OUT per Definition kein Eingabewert existiert, also die Variable initialisiert werden müsste, aber für Typen ala String/Array/Interface bricht der Compiler dieses, da sonst die ordnungsgemäße Speicherverwaltung nicht mehr garantiert werden kann.
|
AW: Procedure vs Function, Vor- und Nachteile
und das man bei OUT innerhalb der procedure/function nicht lesend darauf zugreifen sollte, so hab ich das verstanden, richtig?
|
AW: Procedure vs Function, Vor- und Nachteile
Man darf, vor allem nachdem man schon etwas zugewiesen hat.
Vor der ersten Zuweisung ist der Wert einfach "undefiniert", so wie bei lokalen Variablen (Integer und so). |
AW: Procedure vs Function, Vor- und Nachteile
Danke, ich habe das mit VAR und OUT nun dank Euch/Dir verinnerlicht! Super Forum & Super Community, ich freue mich hier sein zu dürfen.
|
AW: Procedure vs Function, Vor- und Nachteile
Das die Warnung bei gemanagten Datentypen garnicht erscheint ist mir ehrlich gesagt bisher nicht aufgefallen:oops:.
Das mit var und out war mir bisher auch nicht bewußt, da ich in der Regel bei solchen Fällen immer var benutzt habe. Man lernt nie aus :) In den letzten Versionen scheint sich da auch (positiv) am Compiler doch einiges geändert zu haben, denn selbst in folgendem Fall, erkennt der Compiler, das result nicht undefiniert sein kann (war schonmal anders :)).
Delphi-Quellcode:
function Test(wupti:boolean):integer;
begin if (wupti) then result := 1 else result := 0; end; |
AW: Procedure vs Function, Vor- und Nachteile
Zitat:
Result ist definitiv nicht initialisiert und besitzt einen Zufallswert, der ggf. dann von dem vorherigen Funktionsaufruf noch zufällig vorhanden ist. Mag sein, dass das jetzt so funktioniert. Dieses Verhalten ist aber nirgends dokumentiert. (Oder ich habe es noch nicht gesehen.) Bei einer nächsten Compilerfunktion wird das ggf. ganz anders sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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