000
10.01.2003, 15:39 Uhr
void*
Generic Pointer (Operator)
|
In einer Anwendung sind z.B. Funktionen bei denen ein Parameter die Adresse einer Callbackfunktion ist oder die Funktion atexit die als Parameter die Adressen von Funktionen bekommt, die beim Aufruf von exit ihrerseits aufgerufen werden.
1. Adresse einer Funktion Der Name einer Funktion (also ohne Klammern) steht für ihre Adresse. Beispiel:
C++: |
int myfunc(char a, float x); = > // myfunc ist die Adresse.
|
2. Definition eines Zeigers auf eine Funktion Rückgabetyp (*Zeigername)(Parameterliste); Beispiel:
C++: |
int(*func)(char ,float);
|
Dies ist ein Zeiger auf eine Funktion mit Rückgabewert int, einem char und einem float Parameter. Nun könnte man also dies schreiben:
Und nun über
myfunc aufrufen. Oft wird auch
geschrieben, um zu verdeutlichen, daß der Aufruf über einen Zeiger erfolgt. Dies ist jedoch nur eine stilistische Frage. Zu all dem noch ein lauffähiges Beispiel:
C++: |
#include <stdio.h> #include <conio.h> /* Diese Funktion macht eine Textausgabe */
void output(int a) { printf("Sie haben %i uebergeben.\n",a); }
/* Diese Funktion addiert zwei float Werte */ float plus(float a, float b) { return(a+b); }
/* Diese Funktion subtrahiert zwei float Werte */ float minus(float a, float b) { return(a-b); } /* Nun der interssante Teil. Diese Funktion liefert je nach dem Wert von selection* einen Zeiger auf die Funktion plus, die Funktion minus oder NULL zurück. Der * Rückgabewert ist ein Zeiger auf eine Funktion die float zurückgibt und 2 float* Parameter hat. */ float (*retfloat(int selection))(float, float) { printf("retfloat wurde aufgerufen!\n"); switch(selection) { case 0: return(plus); case 1: return(minus); default: return(NULL); } }
int main(void) { double x=3.22424, y=1.3234, result; int z=33, count; /* Definition zweier Zeiger auf Funktionen */ void (*fkt)(int); float (*fkt2)(float, float); /* fkt wird die Adresse der Funktion output zugewiesen und dann wird output * über fkt aufgerufen */ fkt=output; fkt(z); /* retfloat() wird mit 3 verschiedenen Werten aufgerufen und liefert * verschieden Pointer bzw. NULL zurück */ for(count=0; count<3; count++) { fkt2=retfloat(count); if(fkt2!=NULL) { result=fkt2(x,y); printf("Das Ergebnis ist: %f\n", result); } else printf("Das war 'ne NULL!\n"); } getch(); return(0); }
|
-- Gruß void* Dieser Post wurde am 10.01.2003 um 15:47 Uhr von void* editiert. |