ein Kapitel zurück                                           ein Kapitel weiter

Nun kommen wir zum Thema 'Zeiger auf Funktionen'. Nun Zeiger auf Funktionen können ganz praktisch sein. Man kann sie in einem Feld Speichern und eine Sprungtabelle daraus machen. Damit meine ich die einzelnen Funktionen mit einem Index ansprechen, ähnlich wie beim Thema zuvor Zeiger auf Felder. Ich werde das Thema auch ganz einfach halten, versprochen! Hier jetzt nun ein leichtes Beispiel....

/*Download:zeige1.c*/
#include <stdio.h>

void helpfunction()
{
printf("Ich bin die helpfunction\n");
}

void hallowelt()
{
printf("Ich sage Hallo Welt\n");
}

void calc()
{
printf("Ich rechne....%d*%d=%d\n",66,99,66*99);
}

void taugenix()
{
printf("Ich tue gar nichts.\n");
}
/*Funktionsindex auf alle Funktionen*/
void (*funkindex[])() = { helpfunction, hallowelt,
calc, taugenix };

int main()
{
int i;

printf("Es stehen 4 Funktionen zur Verfügung,\n");
printf("Bitte wählen sie eine aus (1-4) : ");
scanf("%d",&i);

/*Funktionsaufruf*/
(*funkindex[i-1])();

return 0;
}

Wir habe hier 4 Funktionen definiert die irgendwas nutzloses zurückgeben. Mit...

void (*funkindex[])() = { helpfunction, hallowelt,
                                          calc, taugenix };


...fassen wir die Funktionen zusammen auf die wir jetzt ähnlich wie bei Zeigern auf Feldern zugreifen können...

(*funkindex[i-1])();

Natürlich können wir den Funktionen auch Parameter übergeben. Der Syntax von Zeigern auf Funktionen sieht wie folgt aus...

typ (* funktionszeiger) (Parameter)

Ganz wichtig an der Deklaration ist die Klammer '(* funktionszeiger)'. Wenn sie diese Weglassen, also....

typ *funktionszeiger(Parameter)    //falsch

...haben sie eine Funktion die einen Zeiger zurückgibt! Schauen wir uns mal einen Zeiger auf Funktionen an bei dem wir Parameter übergeben...

/*Download:zeige2.c*/
#include <stdio.h>
#include <math.h>

static int zahl;

int addition(int zahl)
{
int y;
printf("%d+>",zahl);
scanf("%d",&y);
fflush(stdin);
return zahl+=y;
}

int subtraktion(int zahl)
{
int y;
printf("%d->",zahl);
scanf("%d",&y);
fflush(stdin);
return zahl-=y;
}

int division(int zahl)
{
int y;
printf("%d/>",zahl);
scanf("%d",&y);
fflush(stdin);
return zahl/=y;
}

int multiplikation(int zahl)
{
int y;
printf("%d*>",zahl);
scanf("%d",&y);
fflush(stdin);
return zahl*=y;
}

int sqrtw(int zahl)
{
double x=sqrt((double)zahl);
printf("(sqrt)%f>",x);
return (int)x;
}


int (*rechenfunk[]) (int) = { addition, subtraktion,
division, multiplikation,
sqrtw };

int main()
{
char op;

printf("no.>");
scanf("%d",&zahl);
do {
printf(" op>");
scanf("%c",&op);
fflush(stdin);
switch(op)
{
case '+': printf("%d",zahl=(*rechenfunk[0])(zahl)); break;
case '-': printf("%d",zahl=(*rechenfunk[1])(zahl)); break;
case '/': printf("%d",zahl=(*rechenfunk[2])(zahl)); break;
case '*': printf("%d",zahl=(*rechenfunk[3])(zahl)); break;
case 'q': printf("%d",zahl=(*rechenfunk[4])(zahl)); break;
default : printf("op '=','+','-','/','*','q'\n"); break;
}
} while(op != '=');

printf("Gesamtergebnis=%d\n",zahl);

return 0;
}

Im Großem und Ganzen dürfte das Programm nicht schwer sein. Wir haben hier 5 Rechenoperationen wie Addition, Subtraktion, Multiplikation, Division und Quadratwurzel. Sie können solange rechnen bis sie das '=' - Zeichen eingeben. Hier ein kurzer Durchlauf. Wenn sie das Programm starten sollte auf dem Bildschirm erscheinen...

no.>

Hier geben sie Ihre 1.Zahl ein und drücken <ENTER>. Wir nehmen mal an wir geben die 8 ein. Anschließend geht es in die do...while - Schleife hinein. Jetzt erscheint auf dem Bildschirm...

op>

Hier können sie den Rechenoperator eingeben entweder : '+','-','*','/' oder 'q'. Wir wollen eine Addition also geben wir das '+' - Zeichen ein und drücken <ENTER>. Nun wird unser Zeichen im 'switch' - Schalter überprüft ob es ein gültiges ist. In unserem Fall wäre das Fall...

case '+': printf("%d",zahl=(*rechenfunk[0])(zahl));break;

Hiermit rufen wir unsere Rechenfunktion mit dem Index 0 auf und übergeben dieser Funktion als Parameter den Wert von 'zahl'. Schauen wir mal unsere Rechenfunktionen an...

int (*rechenfunk[]) (int) = {
     addition, subtraktion,
     division, multiplikation,
     sqrtw };


Die Rechenfunktion mit dem Index 0 ist die Funktion Namens 'addition'. 'subtraktion' hat den Index 1, 'division' den Index 2 usw. In unserer Funktion 'addition' geben wir dann die Zahl ein mit der wir unseren Übergebenen Wert addieren wollen. Wir übergeben hier die 2 und drücken <ENTER

10 op>

Jetzt können sie einen weiteren Operator eingeben solange bis sie bei der 'op

Wozu sind Funktionszeiger überhaupt gut? Nun Funktionszeiger sind maßgeblich an der Objektorientieren Programmierung (OOP) beteiligt. In einem späteren Kapitel will ich Ihnen zeigen wie man OOP in C bewerkstelligen kann.

Aufgabe

Unsere Aufgabe soll es sein unser Programm mit den Rechenfunktionen so umzuändern damit wir mit 'double' - Werten rechnen können. Außerdem sollen sie eine Funktion hinzufügen zu Berechnen der Hypotenuse mit dem Lehrsatz des Pythagoras = c*c = a*a + b*b = sqrt(c) = a*a + b*b. Und noch eine einfacher Funktion zur Berechnung des Volumen einer Kugel = Volumen=Pi *(d*d*d)/6. (d=durchmesser). Gehen sie einfachfalber davon aus das die Abfrage unserer 1. Zahl für die Kathetee a und für den Durchmesser d stehen.

Hier geht's zur Lösung!

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf