Der Epina Delphi-Kurs bietet Ihnen eine allgemeine Einführung in das Programmieren mit Delphi/Pascal. Mit vielen ausgearbeiteten Beispielen können Sie direkt in die Delphi-Programmierung einsteigen. Mehr dazu finden Sie hier....



Unterprogramme - Prozeduren und Funktionen

Professionelles Programmieren bedeutet immer auch mit möglichst wenig Aufwand den maximalen Erfolg zu erzielen. Eine der Strategien, möglichst hohe Effizienz beim Programmieren zu erzielen, ist der Einsatz von wiederverwendbarem Code. Dies ist u.a. eines der Ziele der objektorientierten Programmierung. Allerdings ist bereits der Einsatz von Unterprogrammen ein erster Schritt zu wiederverwendbarem Code.

Die Idee hinter Unterprogrammen ist einfach: wenn man einen Programmteil so gestaltet, dass dieser nur über eine definierte Schnittstelle benützt werden kann und keine Nebenwirkungen auftreten, so kann dieser Programmcode in verschiedenen Situationen immer wieder aufgerufen werden. Der Aufruf eines Unterprogramms geht dabei technisch so vor sich, dass die Rückkehradresse vor dem Aufruf auf dem Stack gespeichert wird. Am Ende des Unterprogramms nimmt dieses die Rückkehradresse vom Stack und springt dorthin.

Aus der Sicht des Programmierers gibt es zwei Arten von Unterprogrammen: Prozeduren und Funktionen. Der Unterschied zwischen diesen beiden Arten liegt darin, dass Funktionen einen Rückgabewert haben und Prozeduren keinen. Man kann also Funktionen in Ausdrücke syntaktisch genau so einbauen wie Konstanten. Allerdings liefern diese "Konstanten" keinen konstanten Wert sondern eben den jeweils berechneten Funktionswert.

Hinweis: Die klare Unterscheidung von Prozeduren und Funktionen ist eine Eigenart von Pascal, andere Programmiersprachen kennen nur Funktionen. In Object-Pascal darf man allerdings Funktionen so benützen als ob sie Prozeduren wären (man ignoriert also den Rückgabewert), so dass es de facto in diesem Punkt zu einer Angleichung von Pascal an andere Programmiersprachen kommt.

Prozeduren

Wie schon erwähnt, haben Prozeduren keinen Rückgabewert - das heißt aber nicht, dass man aus Prozeduren keine dort berechneten Werte zurückgeben kann, sondern nur, dass der Prozedurname nicht wie eine Konstante in den Code eingebaut werden kann. Eine Prozedur weist folgende Struktur auf:

In der Kopfzeile werden der Name der Prozedur und eventuelle Parameter deklariert. Werden keine Parameter übergeben, so lässt man die Klammer einfach weg. Die Übergabe der Parameter kann auf zweierlei Art erfolgen: Entweder als Konstante, oder als Variable. Soll ein Parameter variabel sein, so muss dies durch ein vorgestelltes var-Statement deklariert werden. In diesem Fall kann die Prozedur diesen Wert ändern und die Änderung wird nach außen auch sichtbar. Die Parameterliste entspricht syntaktisch einer normalen Variablendeklaration, es dürfen auch mehrere Variablen gleichen Typs mit Beistrichen getrennt zusammengefasst werden (siehe Beispiele unten).

Fast jedes Unterprogramm benötigt Variablen zur Durchführung der Aufgabe. Hilfsvariablen, die nur während der Ausführung der Prozedur notwendig sind, werden als lokale Variablen deklariert. Diese werden zwischen Prozedurkopf und Prozedurkörper deklariert und sind nur während der Abarbeitung des Unterprogramms vorhanden und gültig. Lokale Variablen verlieren ihren Wert zwischen zwei Aufrufen der Prozedur, da die lokalen Variablen am Stack angelegt und beim Verlassen des Unterprogramms wieder zerstört werden.

Beispiele: Die folgenden drei Prozeduraufrufe zeigen drei verschiedene aber typische Einsatzfälle von Prozeduren.

  procedure LoadStandardPalette;
Diese Prozedur lädt einen Satz von vordefinierten Farben. Parameter sind nicht nötig, daher wird die Klammer weggelassen.

  procedure MarkAllItems (ItemID: ItemType; ClassNumber: byte);
Hier werden zwei Parameter übergeben, die dazu dienen, im Prozedurkörper die notwendigen Informationen zur Bearbeitung der Aufgabe zur Verfügung zu haben.

  procedure M2R (xin,yin: longint; var xout,yout:  double);
Bei diesem Aufruf werden nicht nur Parameter an die Prozedur übergeben, sondern es wird auch ein Ergebnis zurückgegeben. Die Parameter xout und yout haben nach dem Aufruf der Prozedur einen von der Prozedur veränderten Wert.

Funktionen

Für Funktionen gilt im Wesentlichen dasselbe wie für Prozeduren. Zusätzlich gibt eine Funktion einen Wert zurück, der dem Namen der Funktion zugewiesen wird. Darum muss im Kopf einer Funktion der Typ des Rückgabewerts deklariert werden (vor dem abschließenden Strichpunkt, durch Doppelpunkt und Typbezeichner). Im Körper der Funktion existiert eine (undeklarierte) Variable mit dem Namen der Funktion; dieser Variablen muss der Rückgabewert zugewiesen werden.

Hinweis: Delphi unterstützt eine Syntaxerweiterung, die es erlaubt im Funktionskörper die vordeklarierte Variable result zu verwenden. Die Variable result enthält den Rückgabewert und kann alternativ zur Zuweisung zum Funktionsnamen verwendet werden. result ist immer vom Typ des Rückgabewerts.

Beispiel: Im Folgenden ist die Deklaration und die Anwendung einer einfachen Funktion gezeigt, die immer den größeren von zwei Werten zurück liefert:

function CalcMax (v1, v2: double): double;

begin
if v1 > v2
  then CalcMax := v1
  else CalcMax := v2;
end;
...
...
var
  FillWeight : double;
...
...
FillWeight := CalcMax(Weight, 50);
...

Die Zuweisung der Funktion CalcMax zur Variablen FillWeight setzt diese auf den Wert von Weight falls Weight größer als 50 ist, ansonsten wird der Wert 50 zugewiesen.


Man kann jede Funktion aber auch in beliebigen Ausdrücken einsetzen: z.B.:

if (sqr(CalcMax(Price1, Price2)) > Threshold) then
  ...

Hier wird zuerst die Funktion CalcMax aufgerufen, um das Maximum der beiden Preise Price1 und Price2 zu ermitteln, dann wird das Resultat quadriert und dann das Quadrat des größeren Preises mit dem Wert Threshold verglichen.


Last Update: 2005-Nov-24