Definition des Funktionszeigetyps
typedef int (*fncSum) (int, int);
Funktion für Summenbildung
int sum(int a, int b){ return a + b; }
Implementierung
void main() { fncSum mySum = ∑ printf( "%d\r\n" , (*mySum)( 1, 2 )); }
Sehr nützlich sind Funktionszeiger für sogenannte Callbacks. Dabei wird zBsp. eine Funktion einer dynamisch geladenen DLL aufgerufen. Nehmen wir mal an, diese Funktion hat als Returnwert einen berechneten Integerwert, der über mehrere Operation ermittelt wird. Nun könnte man sich zwar die Zwischenergebnisse in einem Array über den Funktionsaufruf zurückgeben lassen - aber cooler ist doch - wenn man sich live bei der Berechnung die Ergebnisse anzeigen lassen kann und evtl. mit Zeitstempel usw. versehen kann.
Als erstes schreiben wir mal unseren Typen für den Funktionszeiger. Dieser Typ muss später der Funktion CalculateInteger und dem Programm, wo die Funktion CalculateInteger genutzt wird bekannt sein. Es wäre also angebracht, diesen Typ in einer Headerdatei zu stecken - und diese bei Bedarf zu laden. Alternativ kann man die Definition auch an den einzelnen Stellen selbst einfügen ;).
//Definition in der Datei mydqf.h typedef int (*fncCalculateInteger) (int, int );
So, nun schreiben wir mal eine Funktion.. die so/oder so ähnlich eine Berechnung durchführen soll. Diese Funktion kann in einer Dll oder auch sonst wo rumliegen ;)
//IrgendeineDll #include "mydef.h" int CalculateInteger(int input, fncCalculateInteger fnc){ int tmp = 0; //Opertion 1 tmp = input * 3.14159265359; if( fnc != NULL ) fnc( 1, tmp ); //Opertion 2 tmp = tmp * tmp; if( fnc != NULL ) fnc( 2, tmp ); //Opertion 3 tmp = tmp + tmp; if( fnc != NULL ) fnc( 3, tmp ); //Opertion 4 tmp = tmp / tmp; if( fnc != NULL ) fnc( 4, tmp ); return tmp; }
Bei jeder Berechnung wird geprüft, ob der Funktionszeiger NICHT NULL und dementsprechend aufgerufen, mit dem Operationsschritt und dem Zwischenergebnis.
Nun kommen wir zum Nutzen des Callbacks.
#include "mydef.h" int tmp[4]; int myCallbackFunctionPrintOut( int step, int tmpCalc ){ printf( "Schritt %d hat als Zwischenergebnis= %d\r\n", step, tmpCalc ); } int myCallbackFunctionStoreCalc( int schritt, int zwCalc ) { tmp[schritt-1] = zwCalc; } int main(){ //Lade der IrgendeineDll .... CalculateInteger( 5, &myCallbackFunctionPrintOut ); CalculateInteger( 5, &myCallbackFunctionStoreCalc); return 0; }
Ausgabe: Schritt 1 hat als Zwischenergebnis= 15 Schritt 2 hat als Zwischenergebnis= 225 Schritt 3 hat als Zwischenergebnis= 450 Schritt 4 hat als Zwischenergebnis= 1 Und das Array hat an den Indizes folgende Werte. tmp[0] = 15 tmp[1] = 225 tmp[2] = 450 tmp[3] = 1