POINTERI LA FUNCTII
Daca intr-o functie este nevoie sa se apeleze alta functie, atunci metoda comoda de lucru este ca aceasta din urma sa fie declarata ca parametru pentru prima functie. In limbajul C, o functie poate apare ca parametru numai ca pointer la acea functie.
Un pointer la o functie se declara prin :
tip ( * nume-functie) (lista-declaratii-parametri) ;
unde "tip" este tipul valorii returnate de functie (poate fi si void), iar "lista-declaratii-parametri" este o lista de declaratori pentru parametri separati prin virgule. Specificarea acestei liste nu este obligatorie.
Exemplu
float ( *func) (unsigned, char) ;
Mai sus se declara func ca fiind un pointer spre o functie care are doi parametri, primul unsigned si al doilea char si returneaza o valoare de tip float.
Un pointer catre o functie are ca valoare adresa de memorie unde incepe partea de instructiuni executabile a functiei in cauza. In ceea ce priveste obtinerea facem precizarea ca numele unei functii neurmat de paranteze rotunde este pointer catre functie.
Daca de exemplu avem functie cu prototipul :
long test (int, float) ;
atunci "test" este pointer la aceasta functie.
Observatie
Parantezele rotunde de la declaratia de pointer la functie : ( *nume-functie) sunt necesare, deoarece fara ele :
tip *nume-functie ( ) ;
obtinem o declaratie corecta, dar de functie ce returneaza pointer (vezi paragraful precedent) si nu de pointer la functie. Aceasta pentru ca "( )" sunt mai prioritare decat "*".
Exemplu 5.8.1
Fie de calculat valoarea aproximativa a integralei definite dintr-o functie f. O metoda suficient de rapid convergenta este metoda Simpson (vezi [ ] pag. ). Formula lui Simpson este:
I h/3 * [f(a)+2(f(a+2h)+f(a+4h)+.+f(a+(2n-2)h) )+4 *(f(a+h)+f(a+3h)+.+f(a+(2n-1)h) ) ]
unde h = (b-a)/2n.
Vom scrie o functie Simpson care calculeaza expresia de mai sus si in care va fi apelata functia f transmisa primeia ca un pointer la functie.
# include "stdio.h"
# include "math.h."
double f (double) ;
double Simpson (double a, double b, unsigned n, double ( *f) ( ) ) ;
/* Ultimul parametru al functiei Simpson este pointer la functia f */
main ( )
while (a > = b || eps < = 0) ;
n = 4 ;
i 2 = Simpson (a, b, n, f) ;
/* Ultimul parametru este pointer la fc. f */
do
while (fabs (i1 - i2) / 15 > = eps) ;
/* Criteriul de oprire este i1 - i2 / 15 eps unde */
/* i2 este urmatoarea aprox. obtinuta dubland nr. de */
/* intervale */ printf ("Valoarea integralei = %f \ n", i2) ;
double Simpson (double a, double b, unsigned n, double ( *pf) ( ) )
/* aproximatie */
double f (double x)
|