Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rückgabewerte von Funktionen und Prozeduren (https://www.delphipraxis.net/6221-rueckgabewerte-von-funktionen-und-prozeduren.html)

Hansa 4. Jul 2003 07:02

Halte mich eben hier dran :wink: :

Zitat:

Titel: Rückgabewerte von Funktionen und Prozeduren
Was da technisch jetzt genau passiert, interessiert mich in der Regel wirklich nicht. Aber vielleicht kann mir mal jemand erklären, wann es zwingend nötig ist eine Funktion bzw. Prozedur zu verwenden und warum. 8) Worauf Assarbad hinaus will, ist wahrscheinlich das hier :
Delphi-Quellcode:
procedure Test (CONST r : real);
und

Delphi-Quellcode:
procedure Test (VAR r : real);
Wie heißt der Vorgänger von Pascal (Wirth) noch ? War es Algol ?

sakura 4. Jul 2003 08:06

@Hansa: Jetzt will ich Dich erst einmal bitten nachzudenken ;-) Abgesehen von Deinem ursprünglich gelieferten Beispiel, welches völlig inkorrekt war, hast Du auch weitere Falsch-Aussagen gemacht. Die gravierendste ist jene, die Du immer wieder anbringst:
Zitat:

Zitat von Hansa
Der Nachteil von Funktionen ist halt, daß man nur einen Wert zurück erhält, während man bei Prozeduren mehrere VAR - Parameter übergeben kann.

Wieso sollte man bei Funktionen keine var-Parameter übergeben können? Das macht die WinAPI stets und ständig, von Delphi auf kannst Du drauf zugreifen. Ein einfaches Beispiel:
Delphi-Quellcode:
function FreeModule(var hLibModule: HINST): BOOL;
function InterlockedIncrement(var Addend: Integer): Integer; stdcall;function GetExitCodeProcess(hProcess: THandle; var lpExitCode: DWORD): BOOL; stdcall;
// u.s.w. u.s.f.
Also ist dieses Argument schon in einmal nichtig.

Ein weiterer Vorteil von Funktionen über Prozeduren ist, deren Rückgabewerte direkt in Berechnungen einbinden zu können. Es besteht nicht der Zwang eine separate Variable zu deklarieren, bevor ich diese nur einmal verwende. Beispiel gefällig? Okay, anhand der Funktionen FileExists und DeleteFile:
Delphi-Quellcode:
 // die wohl viel elegantere Lösung via Funktion
// function FileExists(const FileName: string): Boolean;
// function DeleteFile(const FileName: string): Boolean;
begin
  if FileExists('C:\Temp\LöschMich.txt') then
    if not DeleteFile('C:\Temp\LöschMich.txt') then
      ShowMessage('Die Datei konnte nicht gelöscht werden');
end;

// hättest Du es so lieber???
// HYPOTHETISCH
// procedure FileExists(const FileName: string; var Result: Boolean);
// procedure DeleteFile(const FileName: string; var Success: Boolean);
var
  Status: Boolean;
begin
  FileExists('C:\Temp\LöschMich.txt', Status);
  if Status then
  begin
    DeleteFile('C:\Temp\LöschMich.txt', Status);
    if not Status then
      ShowMessage('Die Datei konnte nicht gelöscht werden');
  end;
end;
Das mal als Beispiel für den Nutzen fon Funktionen. Und das Argument der var-Parameter zieht nicht ;-) Erinnere Dich an den Auszug der Delphi-Grammatik-Regeln. Die geben an, daß die Parameter-Listen Definition für Prozeduren und Funktionen identisch sind. Was in der einen geht, geht auch in der anderen.
Code:
[b]Funktionskopf [/b]-> FUNCTION Bezeichner [Formale Parameter] ':' (Einfacher Typ | STRING)
[b]Prozedurkopf [/b]-> PROCEDURE Bezeichner [Formale Parameter]
[b]Formale Parameter [/b]-> '(' Formaler Parameter ';'. ')'
[b]Formaler Parameter [/b]-> [VAR | CONST | OUT] Parameter
[b]Parameter [/b]-> Bezeichnerliste [':' ([ARRAY OF] Einfacher Typ | STRING | DATEI)]
          -> Bezeichner ':' Einfacher Typ '=' Konstanter Ausdruck
Noch ein weiterer Vortail eine Funktion gegenüber einer Prozedur ist, wenn man nur einen Rückgabewert erwartet, die Geschwindigkeit. Durch die Rückgabe dieses Wertes im (E)AX Register, sind den möglchen Optimierungen durch den Compiler viel mehr Raum gegeben.
Zitat:

Zitat von Hansa
Angenommen es muß eine Zahl berechnet werden in einem konkreten Fall, z.B. die Mehrwertsteuer. Wo liegt da hier ein Unterschied ?
Delphi-Quellcode:
procedure MWSTproc (netto : real;var brutto : real);
  begin
    brutto := netto * 1.16;
  end;
Delphi-Quellcode:
function brutto (netto : real) : real;
  begin
    brutto := netto * 1.16;
  end;

Zitat:

Zitat von Hansa
In beiden Fällen muß sowieso noch eine globalere Variable deklariert werden, um mit dem berechneten Wert zu hantieren.

Ich erinnere an mein gerade angeführtes Beispiel mit FileExists, ich kann die Funktion direkt in weitere Berechnungen einsetzen und muss nicht eine weitere Variable einführen, um den Wert zu hantieren.

Bevor Du jetzt die Diskussion fortsetzt, biite ich Dich, Dir mal den Delphi-Language Guide in die Hand zu nehmen und Dich über die (weiteren) Unterschiede von Prozedure und Funktion zu informieren.

...:cat:...

Hansa 4. Jul 2003 08:27

ach, wie ist das herrlich. Was liebe ich solche Grundsatzdiskussionen. 8) Könnte fast ein C++ - Forum sein. :mrgreen: Schlimm ist, daß Sakura Recht hat. :lol: Bei Funktionen können auch mehrere VAR Parameter übergeben werden. Und sie können, wie er richtig sagt, direkt für weitere Berechnungen benutzt werden.

Für mich ist letzteres der einzige Grund, Funktionen zu benutzen. Ansonsten ist es mir egal. Compiler-Optimierungen? Da möge mal einer eine Zahl nennen. Wieviel % macht es aus, wenn statt Prozeduren Funktionen oder umgekehrt verwendet werden?

sakura 4. Jul 2003 08:45

Zitat:

Zitat von Hansa
Compiler-Optimierungen? Da möge mal einer eine Zahl nennen. Wieviel % macht es aus, wenn statt Prozeduren Funktionen oder umgekehrt verwendet werden?

Lässt sich schwer in Zahlen fassen. Und ich gebe Dir recht, meist ist das auch nebensächlich. Allerdings, wenn Du wie ich, an einer Software arbeitest, die mehrere 1000 Anfragen pro Minute, manchmal über 1000 in einer Sekunde, abarbeiten muss, dann wird jeder noch so geringe Geschwindikeitsvorteil wichtig. Deshalb habe ich das auch mit angebracht. Bei Desktop-Software mit einem "lahmen" User an einer "schnellen" Machine kommt es auf die paar Millisekunden nicht an, richtig.

...:cat:...

Hansa 4. Jul 2003 09:05

Na also, auch hier hat jeder Recht :lol:, aber eines fehlt noch (insbesondere für Anfänger gefährlich) : Manchmal macht es eher Sinn, einen berechneten Wert in einer Variablen zu speichern, anstatt ihn dauernd neu zu berechnen. Aus Sakuras Millisekunden werden sonst tatsächlich spürbare Wartezeiten. Dies gilt insbesondere für Datenbank-Zugriffe innerhalb einer Funktion.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Seite 4 von 4   « Erste     234   

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