Inhaltsverzeichnis

Funktionszeiger

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 ));
}

Callback

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