Programmieren in C - . Dr. Nikolaus Wulff Programmieren in C 3 Zeiger auf Funktionen • Ein Funktionszeiger wird deklariert als: • Wichtig ist die Klammer bei der

  • Published on
    06-Feb-2018

  • View
    214

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Prof. Dr. Nikolaus Wulff</p><p>Programmieren in CProgrammieren in C</p><p>Zeiger auf Funktionen</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 2</p><p>Zeiger auf Funktionen</p><p> Zeiger verweisen auf beliebige Speicherstellen. Im Allgemeinen werden Zeiger ausgerichtet auf </p><p>Variablen, wie z. B. Strukturen oder Felder. D. h. der Zeiger verweist auf den Datenbereich.</p><p> Es ist jedoch auch mglich einen Zeiger auf die Adresse einer Funktion verweisen zu lassen.</p><p> Mit Hilfe eines solchen Zeigers lsst sich dann eben diese Funktion aufrufen.</p><p> Diese Zeiger lassen sich auch als Argumente an andere Funktionen bergeben.</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 3</p><p>Zeiger auf Funktionen Ein Funktionszeiger wird deklariert als:</p><p> Wichtig ist die Klammer bei der Deklaration eines Function Pointers:</p><p> Nur die letzte Variante ist ein Funktionszeiger. </p><p>int *f; /* Zeiger auf ein int */</p><p>int *f(); /* Funktion mit Rckgabe int-Zeiger */</p><p>int (*f)(); /* Zeiger auf Funktion mit Rckgabe int */</p><p> (*ptr_name)()</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 4</p><p> FunctionPointer</p><p> Die Deklaration eines Zeigers auf eine Funktion (FunctionPointer) sieht auf dem ersten Blick etwas gewhnungsbedrftig aus:</p><p> (*fct) ist ein Zeiger auf eine reelwertige Funktion mit double Variablen und Rckgabewert, z.B. sin(x).</p><p> (*subr) ist ein Zeiger auf eine Methode ohne Argumente und Rckgabewert.</p><p> (*cmp) ist ein Zeiger auf eine Funktion mit einem int als Rckgabewert und zwei Argumenten vom Typ void* .</p><p>double (*fct)(double x);void (*subr)(void);int (*cmp)(void *px,void *py);</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 5</p><p>Auswertung eines FP's</p><p> Die Methode printFctAt soll den Wert einer beliebigen Funktion zum Argument x ausgeben:</p><p> fct ist der Zeiger auf eine beliebige (reelwertige) Funktion,</p><p> x ist das Argument der Funktion. printf wertet fct(x) mit Argument x aus ...</p><p>void printFctAt(double(*fct)(double), double x) { printf("Funktion(%f) = %f \n", x, fct(x));</p><p>}</p><p>Zeiger auf die Funktion</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 6</p><p>Typedef auf FunctionPointer</p><p> Mit einem typedef lsst sich die Schreibweise fr einen FunctionPointer elegant vereinfachen:</p><p> Ebenso wie normale Zeiger knnen nun auch Zeiger auf Funktionen als Variablen und eigene Typen verwendet werden.</p><p>/** * Declare a real valued Function. */typedef double (*Fct)(double x);/** * Prototyp for printFctAt. */void printFctAt(Fct f, double x);</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 7</p><p>Verwendung von printFctAt</p><p> Die Verwendung zeigt, das prinfFctAt ganz universell beliebige Funktionen auswerten kann... </p><p>void printFctAt(double(*fct)(double), double x) { printf("Funktion(%f) = %f \n", x, fct(x));}</p><p>double square(double x) { return x*x;}</p><p>void main() {</p><p> double x; x = 3.14/4; printfFctAt(cos, x); /* cos from */ printfFctAt(square ,x); /* self made function */ ...</p><p>Funktion wirdausgewertet</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 8</p><p>Numerische Differentiation</p><p> Mit Hilfe eines Funktionszeigers soll eine Methode zum Ableiten beliebiger stetig differentierbarer Funktionen entwickelt werden.</p><p> Ausgangspunkt ist die Definition der Ableitung als Grenzbergang:</p><p> Formal kann dieser Grenzbergang approximiert werden durch eine Folge immer kleinerer h-Werte.</p><p> Die Frage ist, wie klein muss/darf h werden?</p><p>f ' x =dfdx</p><p>=limh0f xh f x </p><p>h</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 9</p><p>Numerische Differentiation (II)</p><p> Anleihe bei der Taylor-Reihe (Mathe II):</p><p> Subtraktion beider Gleichungen liefert fr kleine h</p><p> Jetzt ist eine Abschtzung des Fehlers mglich. Fr z.B. h=0.001 ist der Fehler in der Grenordnung 0.0000001 mal der dritten Ableitung von f.</p><p>f xh= f x h f ' x h2</p><p>2f ' ' x O h3</p><p>f xh= f x h f ' x h2</p><p>2f ' ' x O h3</p><p>f ' x f xh f xh2h</p><p>O h2</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 10</p><p>/** * Differentiate any given Function at point x. * @param f: function to differentiate * @param x: double the argument where to differentiate * @return: double with the value of f'(x) */double differentiate(double (*f)(double), double x) { double h = 0.0001; return (f(x+h)-f(x-h))/(2*h);}</p><p>void main() { double x; for(x = 0;x &lt; 1; x+=0.1) { printf("x=%f sin=%f, cos=%f, f'= %f\n", x, sin(x), cos(x), differentiate(sin,x)); }}</p><p>Differentiation einer Funktion</p><p>x=0.200000 sin=0.198669, cos=0.980067, f'= 0.980067x=0.300000 sin=0.295520, cos=0.955336, f'= 0.955336</p><p>Ausgabe:</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 11</p><p>FP fr eigene Funktionentypedef double (*Fct)(double x);</p><p>double xsquare(double x) { return x*x;}</p><p>void main() { double x; Fct fct; /* FP as variable */</p><p> fct = sin; /* sin from */ for(x = 0;x &lt; 1; x+=0.1) { printf("x=%f sin=%f f'= %f\n", x, sin(x),differentiate(fct,x)); } fct = xsquare; /* self defined... */ for(x = 0;x &lt; 1; x+=0.1) { printf("x=%f x^2=%f f'= %f\n", x, xsquare(x),differentiate(fct,x)); }}</p><p>x=0.400000 x^2=0.160000 f'= 0.800000Ausgabe:</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 12</p><p>Callback Methoden</p><p> Funktionszeiger und Strukturen werden hufig in graphischen Fenstersystemen verwendet, um sogenannte Callback-Methoden zu implementieren.</p><p> Beispiel: Ein Button muss beim Drcken eine bestimmte Funktionalitt ausfhren. </p><p> Der Entwickler der Button Routine wei jedoch nicht in welchem Kontext der Button verwendet wird. Einmal ist damit ein FileOpenDialog assoziert, ein </p><p>anderes Mal die Auswahl einer Farbe oder Schrift etc. </p><p> Wie lsst sich ein solch unterschiedliches Verhalten realisieren?</p></li><li><p>Prof. Dr. Nikolaus Wulff Programmieren in C 13</p><p>Buttons und Menus</p><p> Die GUI Elemente sind Strukturen mit Platzhaltern fr entsprechende Callback Methoden.</p><p> Beim Bettigen eines Buttons wird die jeweilige Callback-Methode aufgerufen und die dahinter codierte Funktionalitt ausgefhrt.</p><p>typedef void (*Callback)(ActionEvent evt);</p><p>typedef struct button_struct { char* text; Callback action;} Button;</p><p>typedef struct menu_struct { char* text; Callback action;} Menu;</p></li></ul>

Recommended

View more >