Funktionen, Teil 1

Funktionsdeklarationen

Eine Funktion in C hat immer eine Datentypenbezeichnung und eine Argumentliste.

Die Datentypbezeichnung kann auch weggelassen werden. Dann handelt es sich definitionsgemäss um eine Integerfunktion. Liefert die Funktion keinen gültigen Wert zurück, so kann der generische Datentyp void angegeben werden. Der zurückgegebene Wert eines Funktionsaufrufs kann, aber muss nicht ausgewertet, bzw. einer Variablen zugewiesen werden.

Benötigt die Funktion keine Argumente, so besteht die Argumentliste lediglich aus einem Klammerpaar. Dieses muss jedoch immer vorhanden sein.

Um dem Programm klarzumachen, wie eine später im Programmtext ausprogrammierte Funktion aussieht, sollte für jede Funktion ein sogenannter Funktionsprototyp zur Verfügung gestellt werden, welcher vor dem ersten Aufruf der entsprechenden Funktion stehen muss.

/* Funktionsprototypen */

double func_1 (void);               /* Keine Argumente erforderlich */

func_2 (void);                          /* Keine Argumente erforderlich */

void func_3 (int);                      /* Ein int-Argument erforderlich */

 

/* Programmcode */

main () /* Auch bei main muss das Klammerpaar angegeben werden */

{

            printf ("%f %d", func_1 (), func_2 ());              /* Auch beim Aufruf  einer Funktion muessen */

            func_3 (func_2 ());                                           /* die Klammern () angegeben werden. */

}

 

double func_1 ()          /* Diese Funktion gibt einen Fliesskomawert zurueck */

{

            double x;

            ...

            return (x);         /* Wert von x als Funktionswert zurückgeben */

}

 

func_2 ()          /* Da nichts angegeben. liefert diese Funktion einen int-Wert zurueck */

{

            int        z;

            ...

            return (z);

}

 

void func_3 (int x) /* Hier wird kein gueltiger Wert zurueckgegeben */

{

            return;

}

Argumente an Funktionen

Sämtliche Argumente an Funktionen werden in C immer als Wert übergeben (call by value). Das bedeutet, für die Funktion wird eine eigene Kopie des übergebenenen Wertes erstellt, welche nach dem Rücksprung aus der Funktion ihre Gültigkeit verliert. Diese Kopie kann nun innerhalb der Funktion nach belieben verwurstelt werden, ohne am Original des Hauptprogramms irgendwelchen Schaden anzurichten.

Soll nun eine Funktion die Möglichkeit haben, den Wert des Originals zu verändern, so muss als Funktionsargument die Adresse der entsprechenden Variable als Argument angegeben werden. Dazu verwenden wir den Adressoperator (&). Die Funktion selbst definiert dieses Argument als Zeiger.

Bei einem Array als Funktionsargument wird automatisch immer die Adresse des Arrays als Wert übergeben. Dies wird vom Compiler sichergestellt.

 

void func_1 (int, int [], int *);    /* Funktionsprototyp */

 

int        iarray[100];

 

main ()

{

            int        n, error;

 

            func_1 (n, iarray, &error);

 

}

 

void func_1 (int n, int array[], int *error)

/* Diese Funktion soll ein Array mit n Elementen sortieren und allenfalls einen Fehlerwert in error        zurueckgeben. */

{

 

            /* Array sortieren */

            ...

            ...

            ...

            /* Fehlervariable setzen */

            *error = 0;

}