AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Result einer Funktion "Stil Frage"

Ein Thema von Jonas Shinaniganz · begonnen am 4. Nov 2012 · letzter Beitrag vom 5. Nov 2012
Antwort Antwort
Seite 2 von 2     12   
Furtbichler
(Gast)

n/a Beiträge
 
#11

AW: Result einer Funktion "Stil Frage"

  Alt 5. Nov 2012, 08:19
Ui, vielen Dank für diese Lehrstunde.

Halten wir fest:
1. Grundsätzlich sollte man (immer! ohne Ausnahme!) das Funktionsresultat initialisieren. Delphi macht das zwar machnmal, aber guter Programmierstil sollte ohne wenn und aber gleichförmig sein.
2. Der Compiler sollte die Warnung 'Rückgabewert... könnte undefiniert sein' auf alle Funktionstypen ausweiten. So wie bei C# zum Beispiel.
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Result einer Funktion "Stil Frage"

  Alt 5. Nov 2012, 09:32
Nur als Bemerkung am Rande: in Free Pascal ist in den Modi fpc und objfpc der Funktionsname als "rvalue" erlaubt. Möchte man hier einen rekursiven Aufruf (bei einer parameterlosen Funktion), so muss ein leeres Klammerpaar angehängt werden.

Delphi-Quellcode:
program resulttest;

{$ifdef fpc}
{$mode objfpc}
{$endif}
{$apptype console}

function Sum: LongInt;
const
  Values: array[0..4] of Byte = (
    1, 2, 3, 4, 5
  );
var
  b: Byte;
begin
  Sum := 0;
  for b in Values do
    Sum := Sum + b; // Sum() würde die Funktion rekursiv aufrufen
end;

begin
  Writeln(Sum); // ergibt "15" und nicht "stack overflow" ;)
end.
Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.019 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#13

AW: Result einer Funktion "Stil Frage"

  Alt 5. Nov 2012, 16:18
Wo schlußendlich die "Result-Variable herkommt, ist also unklar.
Das ist keineswegs unklar, denn wie du zuvor richtigerweise ausgeführt hast, ist das ein var Parameter.
Im Fall einer Zuweisung ist es die Variable, welcher du zuweist. Andernfalls eine vom Compiler erzeugte Variable.

Das kann man sich auch in der CPU Ansicht anschauen.

Im von dir gezeigten Beispiel wird dort s übergeben

Code:
s := Test;
8D45F4           lea eax,[ebp-$0c]
E8A4FFFFFF      call Test
Weist man auf etwas zu, was nicht als var Parameter übergeben werden kann (z.b. eine Property), dann wird die compiler erzeugte Variable benutzt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  for i := 0 to 2 do
    Caption := Test;
  ShowMessage(s);
end;
Code:
Caption := Test;
8D45EC          lea eax,[ebp-$14]
E8A1FFFFFF      call Test
8B55EC          mov edx,[ebp-$14]
8B45FC          mov eax,[ebp-$04]
E8C662FBFF      call TControl.SetText
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#14

AW: Result einer Funktion "Stil Frage"

  Alt 5. Nov 2012, 16:25
Ich meinte unklar, aus Sicht der Funktion.

Die Funktion weiß nicht wo die Variable ihrer Results genau herkomm. Das kann eine Globale sein, irgenein Feld einer Klasse oder eine fremde Lokale.
Ist aber im Prinzip auch egal, da die Funktion nicht sicher sein kann, daß die externe Variable "leer" ist.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#15

AW: Result einer Funktion "Stil Frage"

  Alt 5. Nov 2012, 16:33
Die externe Variable wurde ordnungsgemäß initialisiert, aber, in Bezug auf die folgende Funktion, ist dieses nicht der Fall.
Delphi-Quellcode:
function Test: string;
begin
  Result := Result + 'abc';
end;

for i := 0 to 2 do
  S := Test;
ShowMessage(S);
Autsch... muss gleich mal ein paar Funktionen durchgehen...
Philip
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20: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