7. Programmeinheiten
 
zurück
7.7.1 Funktionen


Eine Funktionsspezifikation hat die Form: function <name> [<parameter_liste>] return <ergebnis_typ>;

Der Unterprogrammname (<name>) soll als Funktionsname das Ergebnis der Funktion möglichst treffend beschreiben. Als <name> sind Bezeichner und Operatorsymbole erlaubt.

In der Parameterliste <parameter_liste> wird zu jedem Parameter - sofern vorhanden (eine Parameterliste kann auch leer sein) - der Parametermodus und der Typ angegeben.

Alle Parameter einer Funktion sind vom Modus "in". Wird der Modus nicht angegeben, ist er automatisch "in".Es ist jedoch guter Programmierstil, den Parametermodus für jeden Parameter zu spezifizieren.

<ergebnis_typ> kennzeichnet den Typ des Rückgabewertes einer Funktion.

Beispiel 1: (mit Parameterliste)

function Maximum (Links : in INTEGER;
Rechts : in INTEGER) return INTEGER;


Hier ist eine Funktion spezifiziert
• mit dem Funktionsnamen "Maximum",
• einer Parameterliste, die aus den Parametern "Links" und "Rechts" vom Typ Integer besteht,
• und einem Rückgabewert, der ebenfalls vom Typ Integer ist.

Beispiel 2: (parameterlose Funktion)

type Wuerfel_Typ is range 1..6;
function Zufallszahl return Wuerfel_Typ;


Der Rückgabewert der parameterlosen Funktion Zufallszahl ist vom Typ Wuerfel_Typ.

Beispiel 3: (Operatorsymbol als Funktionsname)

function "+" ( Links : in FLOAT;
Rechts : in INTEGER) return FLOAT;


Die Funktion kann über Präfix- und Infix-Notation aufgerufen werden.

Ein Funktionsrumpf hat die Form:

function <name> <parameter_liste> return <ergebnis_typ> is
<lokale Vereinbarungen>
begin
<Anweisungen>
return <Ausdruck>
end <name>;

In den Funktionsrumpf wird die Funktionsspezifikation wieder aufgenommen.Dann kann ein lokaler Vereinbarungsteil (<lokale Vereinbarungen>) folgen, um lokale Typen, Variable oder auch untergeordnete Programmeinheiten zu deklarieren.

Der Anweisungsteil wird durch begin und end geklammert. Im Anweisungsteil einer Funktion muß mindestens eine Rückkehranweisung (return <Ausdruck>) enthalten sein. Ein guter Programmierstil kommt, soweit die Transparenz nicht leidet, mit einer Rückkehranweisung aus.

Es muß nicht zu jedem Funktionsrumpf eine explizite Spezifikation geben. Der Text am Anfang eines Rumpfes kann als implizite Spezifikation dienen. Eine implizite Spezifikation ist z. B. dann ausreichend, wenn eine Funktion lokal in einer Programmeinheit verwendet wird, da sie nicht nach außen bekanntgegeben wird.

Beispiel 1:

function Maximum (Links : in Integer; Rechts : in Integer) return Integer is
   Max : Integer := 0;
begin
   if Links > Rechts then
      Max := Links;
   else
      Max := Rechts;
   end if;
   return Max;
end Maximum;

Die Funktion "Maximum" mit den Parametern "Links" und "Rechts" vom Typ Integer bestimmt den größten dieser beiden Werte und gibt ihn als Rückgabewert der Funktion zurück. Um den größten der beiden Werte zu ermitteln, wird die lokale Variable "Max" verwendet. Wenn die Fallunterscheidung mit if-then-else abgeschlossen ist, dann wird "Max" als Rückgabewert übergeben und die Funktion wird beendet.

Beispiel 2:

function Maximum (Links : in Integer; Rechts : in Integer) return Integer is
begin
   if Links > Rechts then
      return Links;
   else
      return Rechts;
   end if;
end Maximum;

Dieses zweite Beispiel zeigt eine Abänderung der Funktion "Maximum". Hier wird auf die lokale Variable "Max" verzichtet. Rücksprünge mittels der Rückkehranweisung erfolgen direkt im If-then-else-Konstrukt.

In diesem kleinen Beispiel kann zwar noch überblickt werden, daß jeder Programmpfad mit einer Rückkehranweisung endet. Es ist leicht vorstellbar, daß bereits in Programmcode mit einigen zusätzlichen Zeilen der Überblick nicht mehr gegeben ist.

Daher sollte am Ende des Anweisungsteils immer nur eine Rückkehranweisung stehen, die von jedem Programmpfad erreicht wird.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.