Vorherige Seite

Eine Ebene hoch

Nächste Seite

4.1.1 Einfache Funktionen (ohne Parameter und Rückgabewert)

In aufwändigeren Programmen gibt es häufig Programmstücke, die an mehreren Stellen benötigt werden. Anstatt die gleichen Zeilen immer wieder zu implementieren, gibt es die Möglichkeit, kleine Unterprogramme, sogenannte Funktionen zu erstellen.

In dem folgenden Programm wird vom Benutzer ein Datum abgefragt. Dabei soll jeweils nach der Abfrage von Tag, Monat und Jahr der Bildschirm gelöscht werden, indem fünfzig Leerzeilen ausgegeben werden. Ohne einer Funktion könnte die Aufgabe wie folgt realisiert werden:

Nach jeder Abfrage wird eine for-Schleife durchlaufen, in der fünfzig Zeilenvorschübe ausgegeben werden. Das gleiche kann einfacher mit Hilfe einer Funktion realisiert werden:

Aus dem Struktogramm wird deutlich, es gibt eine Funktion, die den Bildschirm löscht. Diese Funktion wird an drei Stellen im Hauptprogramm aufgerufen, jeweils nach den Benutzerabfragen. Der zweite Block beschreibt die Funktion, mit der fünfzig Leerzeilen ausgegeben werden.

Im C-Programm sehen wir wie im Struktogramm im unteren Teil die Definition der Funktion. Die Definition einer Funktion beginnt immer mit der Beschreibung des Ein- und Ausgabeverhaltens der Funktion, in unserem Beispiel:

Der Funktionsname ist ClrScr (clear screen, lösche den Bildschirm). Das void vor dem Funktionsnamen deutet an, dass die Funktion keinen Wert zurückgibt. Das void in den runden Klammern hinter dem Funktionsnamen bedeutet, dass die Funktion auch keine Parameter übernimmt.

Nach dieser allgemeinen Beschreibung der Funktion erfolgt in geschweiften Klammern der eigentliche Inhalt der Funktion. In unserem Beispiel ist das die for-Schleife, mit der fünfzig Leerzeilen ausgegeben werden. Für die Schleife wird innerhalb der Funktion lokal eine Variable definiert. Am Ende der Funktion steht ein return. (Da kein Wert zurückgegeben wird, könnte der Befehl an dieser Stelle auch weggelassen werden.)

Der Aufruf der Funktion ClrScr erfolgt durch Angabe des Namens gefolgt von leeren runden Klammern, da keine Parameter übergeben werden. Der Aufruf wird wie alle Anweisungen mit einem Semikolon abgeschlossen.

Wenn der Übersetzer (Compiler) das Programm übersetzt, so braucht er vor dem ersten Aufruf der Funktion Informationen über die Existenz und Beschaffenheit der Funktion. Eine mögliche aber unübliche Struktur des Programms wäre es, die Definition der Funktion vor das Hauptprogramm main zu setzen. Allerdings gibt es Situationen, in denen sich Funktionen gegenseitig (oder sich selbst) aufrufen (rekursive Programmierung), bei denen diese Struktur versagt.

In unserem Beispielprogramm wird eine andere Struktur gewählt: Gleich am Anfang wird die Existenz und Beschaffenheit der Funktion deklariert. Das heißt, der Name der Funktion, die zu übergebenden Parameter und der Rückgabewert wird festgelegt; aber die Definition der Funktion erfolgt später.

In unserem Beispiel sieht die Deklaration der Funktion exakt genauso aus wie die Definition der Funktion, nur dass die Deklaration durch ein Semikolon abgeschlossen wird.

Einige Anmerkungen:

Am Anfang steht ein Prototyp der Funktion: void ClrScr(void); das ist die Deklaration der Funktion, das heißt, hier wird deklariert, dass es eine Funktion dieser Art geben wird. Die Definition der Funktion ist die eigentliche Implementierung der Funktion und folgt später.

Also nochmal, um die Begriffe klar zu bekommen: Mit der Deklaration wird die Funktion nur angekündigt. Die Implementierung erfolgt später bei der Definition der Funktion.