Newsgroup: it.comp.lang.c
Titolo: Puntatori a funzione

Che mi spiega per bene i Puntatori a funzione???
Tnk 10000000000000000000000000000000000000000000000000
-- 
.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
Ciao da Kleidemos
C++ Programmer
.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

 Che mi spiega per bene i Puntatori a funzione???
Che cosa non hai capito dei puntatori a funzione? Se fai domande precise
avrai risposte precise.
Lo scopo di questi e' quello di poter richiamare una funzione non attraverso
il suo nome, ma attraverso un alias di queste (in pratica conoscendone
l'indirizzo) memorizzato in una variabile.
Tanto per farti un esempio, in una programmazione ad oggetti, il metodi di
un oggetto sono dei puntatori a funzione (se lavori in C e' esattamente
cosi', in altri linguaggi la sostanza e' la stessa, anche se non usi il
meccanismo esplicito dei puntatori a funzione).
La dichiarazione e' pressapoco cosi':
tipo_ritorno (*puntatore_funzione)(parametri)
L'assegnamento avviene cosi':
puntatore_funzione = nome_funzione;
(nota che NON devi mettere le parentesi: non devi invocare la funzione, ma
solo copiarne l'indirizzo)
Es.
puntatore_funzione = fgets;
Per chiamarla dal C89 in poi puoi tranquillamente usare questa sintassi:
puntatore_funzione(parametri)
Per avere un esempio guarda il kernel di linux o le GTK+.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 Tnk 10000000000000000000000000000000000000000000000000
Procurati dalla rete "Tricky C" (link:
http://ada2.unipv.it/biblio/trickyc/trkcfrm.htm
). Per imparare il C le prime
100 pagine sono favolose. (ci sono anche i puntatori a funzione ed un
interessantissimo esempio sul loro utilizzo).
Maurizio

 avrai risposte precise.
Non ho ben capito la loro utilita in un prog


  Hai presente una "macchina a stati"? Come un centinaio di stati?
Pensa quanto sia utile scrivere un programma il cui "flusso" non è indicato
nel "codice", ma in una struttura, modificabile a runtime...
Ciao :-)

Kleidemos wrote:

Hai una funzione richiamabile da una variabile.
Questo significa che puoi chiamare funzioni diverse sempre utilizzando la
stessa variabile (basta cambiare il contenuto della variabile).
Devi ragionare in ottica di programmazione ad oggetti o di framework, se
pensi ad un programmino interamente scritto da te per uno specifico uso non
ti verra' mai l'ispirazione.
Esempio scemo: ti fornisco un oggetto che avvia un ciclo di attesa su un
socket e come il socket e' pronto a mandarti dei dati, l'oggetto chiama una
funzione definita dall'utente per memorizzare i dati ed elaborarli.
Io ti scrivo il programma che sta in ascolto, tu ti implementi solo la
callback... il bind lo fai con un puntatore a funzione.
Un'altra persona ha un esigenza simile, ma vuole un comportamento diverso?
Basta cambiare il valore del puntatore a funzione.
Per esempio piu' serio tutto il meccanismo delle callback in GTK e'
implementato come puntatore a funzione: ogni volta che con il mouse
schiacci un tasto, si esegue la funzione specifica associata a quel tasto,
senza che tu debba riscriverti il widget per il tasto per adattarlo al
comportamento voluto.
Se implementi un ADT albero binario, vuoi con una sola funzione effettuare
una visita a tutti i nodi dell'albero con il metodo dell'ADT, implemnti la
funzione di visita perche' accetti come parametro un puntatore a funzione
che verra' chiamato dalla funzione di visita automaticamente su tutti i
nodi (senza che tu debba scriverti la tua funzione di visita).
Se tu stai scrivendo un MUD, puoi implementare i MOB lasciando un puntatore
a funzione, cosi' ad un mob specifico (senza dover riscrivere l'oggetto
MOB) puoi associare funzionalita' extra che tutti gli altri (a livello di
codice uguali) non hanno :)


 un interessantissimo esempio sul loro utilizzo).
L'esempio potra' pure essere interessante, ma ricorda che la guida in se non
e' per niente una buona guida: riguarda principalmente il DOS, e in
particolare al turbo C, e non e' aggiornata al C89 (non lo standard
attuale, ma quello precedente).


 Mox
Ovviamente, per questo ho specificato "le prime 100 pagine"...
riguardo allo standard a cui si e' fermato, hai ragione e' il C89 non lo
ricordavo
ma devi anche capirmi, lessi quel manuale un bel po' di anni fa =P
Saluti,
Maurizio