Delphi-PRAXiS
Seite 2 von 10     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Procedure vs Function, Vor- und Nachteile (https://www.delphipraxis.net/196015-procedure-vs-function-vor-und-nachteile.html)

Ghostwalker 15. Apr 2018 14:08

AW: Procedure vs Function, Vor- und Nachteile
 
Weil der Programmierer bewußt die Compiler-Warnung "Result wurde nicht initialisizert !" ignoriert. Somit behält result u.U. seinen Wert und es wird dazu ein 'a' addiert.

günni0 15. Apr 2018 14:12

AW: Procedure vs Function, Vor- und Nachteile
 
Boing... jetzt habs ich kapiert. Also ein klassischer Fehler.

himitsu 15. Apr 2018 14:18

AW: Procedure vs Function, Vor- und Nachteile
 
Wie gesagt, der Compiler macht aus solchen Funktionen eben eine Prozedur mit VAR-Parameter
Delphi-Quellcode:
procedure Test(var Result: string); //function Test: string;
begin
  Result := Result + 'a';
end;

for i := 1 to 5 do
  Test(S); //S := Test;
ShowMessage(S); // 'aaaaa'
Grundsätzlich ist das für den Entwickler egal.
Er muß eben nur selber aufpassen, dass er solche Variablen initialisiert. Am Enfachsten grundsätzlich immer alle Result-Variablen selber initialisieren, wenn mit dem Startwert gerechnet wird.
Für den Compiler ist es so halt viel anfacher die Result-Variable zu verwalten, denn bei gemanagten Typen muß er selber dafür sorgen, dass letztendlich diese Variable immer ordnungsgemäß freigegeben werden und das ist hier einfacher, wenn er direkt die äußere Variable nimmt.

KodeZwerg 15. Apr 2018 14:28

AW: Procedure vs Function, Vor- und Nachteile
 
Zitat:

Zitat von Ghostwalker (Beitrag 1399309)
Compiler-Warnung "Result wurde nicht initialisizert !"

Erscheint bei mir nicht, Warnungen (0), Fehler (0)
Muss ich irgendwo was ändern das der eine Warnung wirft bzw hab ich irgendwo was abgeschaltet was das verhindert?

edit
Delphi-Quellcode:
function Test1: string;
begin Result := Result + 'a'; end;

function Test2: string;
begin Result := 'a' + Result; end;

procedure TForm1.Button1Click(Sender: TObject);
var i : Byte; S : String;
begin
  for i := 1 to 5 do S := Test1;
  Label1.Caption := S;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : Byte; S : String;
begin
  for i := 1 to 5 do S := Test2;
  Label2.Caption := S;
end;
So ist's in meinem Delphi ohne Warnungen/Fehler kompiliert worden.

himitsu 15. Apr 2018 14:55

AW: Procedure vs Function, Vor- und Nachteile
 
Zitat:

Zitat von KodeZwerg (Beitrag 1399314)
Zitat:

Zitat von Ghostwalker (Beitrag 1399309)
Compiler-Warnung "Result wurde nicht initialisizert !"

Erscheint bei mir nicht, Warnungen (0), Fehler (0)
Muss ich irgendwo was ändern das der eine Warnung wirft bzw hab ich irgendwo was abgeschaltet was das verhindert?

Lesen?

https://www.delphipraxis.net/1399299-post7.html

Delphi.Narium 15. Apr 2018 15:03

AW: Procedure vs Function, Vor- und Nachteile
 
Bei Delphi 7 kann man in den Projektoptionen unter Compilermeldungen auswählen, ob die Warnung 'Dr Rückgabewert der Funktion könnte undefiniert sein.' ausgegeben werden soll oder nicht.

Sieht bei den Meldungen dann sinngemäß so aus:
Code:
[Warnung] Unit1.pas(Zeile): Rückgabewert der Funktion 'TForm1.NameDerFunktion' könnte undefiniert sein

KodeZwerg 15. Apr 2018 15:07

AW: Procedure vs Function, Vor- und Nachteile
 
@himitsu: Ja schon, Du schreibst werden nicht Angezeigt, Ghostwalker schreibt das der Programmierer diese Warnung ignoriert.
Wenn er also eine Angezeigt bekommt, das hätte ich auch gerne, weshalb ich da nochmal nachhakte.

Redeemer 15. Apr 2018 15:22

AW: Procedure vs Function, Vor- und Nachteile
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1399318)
Bei Delphi 7 kann man in den Projektoptionen unter Compilermeldungen auswählen, ob die Warnung 'Dr Rückgabewert der Funktion könnte undefiniert sein.' ausgegeben werden soll oder nicht.

Sieht bei den Meldungen dann sinngemäß so aus:
Code:
[Warnung] Unit1.pas(Zeile): Rückgabewert der Funktion 'TForm1.NameDerFunktion' könnte undefiniert sein

Darum geht es nicht. Es geht darum, in der Funktion die Ergebnisvariable zu lesen bevor sie geschrieben wurde:
Delphi-Quellcode:
function Test: string;
begin
  Result := Result + 'a';
end;
Es geht aber noch schlimmer:
Delphi-Quellcode:
function Test: Integer;
begin
  Result := Result + 1;
end;

begin
  ShowMessage(IntToStr(Test));
end;
Niemand wird dir sagen können, was dieses Programm tut.

Delphi.Narium 15. Apr 2018 15:33

AW: Procedure vs Function, Vor- und Nachteile
 
Doch, es geht u. a. um die entsprechende Warnung:

Ghostwalker schrieb hier: https://www.delphipraxis.net/1399309-post11.html, dass es sie gibt.

Und Kodezwerg schrieb dort: https://www.delphipraxis.net/1399314-post14.html, dass er die Meldung nicht erhalte und fragte nach, was er machen/ändern müsse, um diese Warnung zu erhalten.

Darauf bezog ich mich und nicht darauf, dass das zur Diskussion stehende Codefragment nicht zwingend klar und verständlich ist, sondern nur als Beispiel für den Unterschied zwischen Prozeduren und Funktionen und ggfls. daraus resultierenden Fallstricken dient.

Ghostwalker 15. Apr 2018 15:45

AW: Procedure vs Function, Vor- und Nachteile
 
Zitat:

Zitat von Redeemer (Beitrag 1399320)
[DELPHI]
Es geht aber noch schlimmer:
Delphi-Quellcode:
function Test: Integer;
begin
  Result := Result + 1;
end;

begin
  ShowMessage(IntToStr(Test));
end;
Niemand wird dir sagen können, was dieses Programm tut.

Doch...es addiert 1 zu einem zufälligen Wert, der zu diesem Zeitpunkt an der Speicherstelle steht.
Und diesen Wert zeigt das Programm dir dann an.

Aber das ganze kann natürlich auch bei komplizierteren Funktionen durchaus noch ganz andere Effekte haben. Genau deswegen gibts die Warnung.


Mit Ignorieren war schlicht gemeint, das die entsprechende Warnung ausgeschalten war, oder die Warnung vom Programmierer bewußt nicht gelesen wurde. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Seite 2 von 10     12 34     Letzte »    

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