AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rückgabewerte von Funktionen und Prozeduren
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewerte von Funktionen und Prozeduren

Ein Thema von Hansa · begonnen am 3. Jul 2003 · letzter Beitrag vom 4. Jul 2003
Antwort Antwort
Seite 4 von 4   « Erste     234   
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#31
  Alt 4. Jul 2003, 08:02
Halte mich eben hier dran :

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 :
procedure Test (CONST r : real); und

procedure Test (VAR r : real); Wie heißt der Vorgänger von Pascal (Wirth) noch ? War es Algol ?
Gruß
Hansa
  Mit Zitat antworten Zitat
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
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#33
  Alt 4. Jul 2003, 09:27
ach, wie ist das herrlich. Was liebe ich solche Grundsatzdiskussionen. 8) Könnte fast ein C++ - Forum sein. Schlimm ist, daß Sakura Recht hat. 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?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

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

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

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#35
  Alt 4. Jul 2003, 10:05
Na also, auch hier hat jeder Recht , 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 02:40 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