7 Funktionen
 

Im Gegensatz zu anderen Programmiersprachen macht C keinen Unterschied zwischen einer Prozedur und einer Funktion. Da jede Prozedur in C einen Wert liefert, ist jede Prozedur eine Funktion.
 
 

7.1 Grundlagen

Unter einer Funktion wird ein Programmteil verstanden, der aus einer oder mehreren Anweisungen besteht (Funktionen ohne Anweisungen sind erlaubt) und eine bestimmte Aufgabe erfüllt. Die Funktionen können in große Gruppen einteilt werden. Dabei handelt es sich um die:

  1. ANSI-C-Funktionen (z.B. printf, scanf, getch etc.),
  1. Funktionen, die mit dem Compiler bzw. Entwicklungssystem zusätzlich mitgeliefert werden,
  1. Funktionen aus Funktions-Bibliotheken (zB. "curses") und die
  1. vom Programmierer selbstgeschriebenen Funktionen.


Ein C-Programm besteht gewöhnlich aus mehreren dieser Funktionen, mindestens aber aus einer, der main-Funktion. Das ist die Hauptfunktion, die in jedem Programm zu finden ist.
 
 

7.2 Aufgaben
 

Zum einen dienen Funktionen dazu, immer wiederkehrende Aufgaben zu einem Programmgebilde zusammenzufassen. Zum anderen werden Funktionen dazu verwendet, ein Programm in logisch zusammengehörige Teile zu unterteilen. Dadurch kann bei der Programmierung Speicherplatz gespart werden. Außerdem trägt dieses Verfahren dazu bei, dass der Quellcode besser lesbar und wartbar ist. Als möglicher Nachteil kann sich dadurch aber auch die Laufzeit eines Programms "vergrößern". Bei den meisten Programmen fällt dieser Nachteil jedoch nicht ins Gewicht.
 
 
 
 

7.3 Der Aufruf

Eine Funktion in C wird einfach über ihren Namen, gefolgt von runden Klammern mit eventuellen Parametern, aufgerufen. Es gilt zu beachten, dass die runden Klammern auch dann nicht wegfallen dürfen, wenn keine Parameter übergeben werden sollen.

Funktionen können in Zuweisungen genauso, wie als Argument von anderen Funktionen auftreten.
 
 
 

7.4 Die Rückgabe
 

Jede Funktion in C generiert intern einen Rückgabewert. Dieser wird der aufrufenden Funktion über die return-Anweisung mitgeteilt. Als Wert der Rückgabe dürfen nur Ausdrücke verwendet werden, die einen einfachen Typ haben. Es ist nicht möglich, Strukturen oder Arrays zu übergeben.

Als Rückgabewert ist eine Konstante, eine Variable, ein komplexer Ausdruck oder wieder ein Funktionsaufruf zulässig.
 

Beispiele:

return;
return(3);
return(x);
return(&x);
return(x+y);
return(sin(2));
 

Die return-Anweisung muss nicht unbedingt am Ende einer Funktion stehen. Sie kann im ganzen Funktionsblock vorkommen. Wird die return-Anweisung ohne Wert verwendet, wird trotzdem ein undefinierter Wert an die aufrufende Funktion zurückgegeben.

Bei der Verwendung von Funktionen ist darauf zu achten, dass sie niemals auf der linken Seite einer Zuweisung stehen dürfen. Funktionen sind Adress-Konstanten und keine Variablen. Das heißt, ein Funktionsname steht für eine Adresse, an der der Funktionskörper im Speicher abgelegt ist. Aus diesem Grund darf auch der Adress-Operator nie auf einen Funktionsnamen angewandt werden, da es sich schon um eine Adresse handelt.
 
 
 
 

7.5 Definition von Funktionen
 

Bevor mit einer neuen Funktion gearbeitet werden kann, muss sie zunächst nach bestimmten syntaktischen Regeln definiert werden. Dabei macht eine Funktionsdefinition Angaben über folgende Dinge:

  1. Speicherklasse der Funktion,
  1. Datentyp der Funktion (dieser bestimmt auch den Typ des Rückgabewertes),
  1. Name der Funktion,
  1. Deklaration der Argumente
  1. lokale und externe Variablen, welche die Funktion benutzt und die
  1. Anweisungen, welche die Funktion ausführen soll.
Das Bild 1 zeigt den Aufbau einer Funktion in grafischer Form. Die eckigen Klammern deuten an, dass es sich um optionale Parameter handelt. Die Parameterliste d1n1, d2n2, ..., dxnx enthält die Argumente, die bei Funktionsaufruf mit übergeben werden sollen. Dabei bedeutet n der Name der Variablen und d stellt den Datentyp der Variablen dar. Es können beliebig viele Parameter aufgeführt werden.
 
 

Bild 1 Aufbau einer Funktion (wird noch erstellt)
 

Es gilt zu beachten, dass nach der Funktionsdeklaration (in der ersten Zeile) kein Semikolon stehen darf. Wird ein Semikolon gesetzt, wird die Funktion als leere Funktion interpretiert, die nichts bewirkt.