Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#32
  Alt 4. Jul 2003, 09: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 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 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 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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat