Newsgroup: it.comp.lang.c++
Titolo: puntatori a funzione: come funzionano?

Ho letto su thinking in C++ (capitolo 3 alla fine) qualcosa molto
interessante
per quanto riguarda i puntatori alle finzioni:
Trovo molto interessante poter "giocare" con queste potenzialità del
C++ ma non ho ben capito quali compiti hanno i singoli "*" e a quali
"puntatori si riferiscono"
esempio:
void * (*(*fp1)(int))[10];
ci sono 3 "*" uno è per il puntatore alla funzione, uno è per il
puntatore all'array uno è per ecc... ma quale di questi è per... quale
è per... ecc...
e negli altri esempi?
float (*(*fp2)(int,int,float))(int);
Quale è la regola generale per creare questi puntatori?
altri esempi?
Grazie in anticipo per il tempo che mi dedicherete.
Rino.
____________________________________________________________________
Complicated declarations & definitions
As an aside, once you figure out how the C and C++ declaration syntax
works you can create much more complicated items. For instance:
//: C03:ComplicatedDefinitions.cpp
/* 1. */     void * (*(*fp1)(int))[10];
/* 2. */     float (*(*fp2)(int,int,float))(int);
/* 3. */     typedef double (*(*(*fp3)())[10])();
             fp3 a;
/* 4. */     int (*(*f4())[10])();
int main() {} ///:~
Walk through each one and use the right-left guideline to figure it
out. Number 1 says “fp1 is a pointer to a function that takes an
integer argument and returns a pointer to an array of 10 void
pointers.”
Number 2 says “fp2 is a pointer to a function that takes three
arguments (int, int, and float) and returns a pointer to a function
that takes an integer argument and returns a float.”
If you are creating a lot of complicated definitions, you might want
to use a typedef. Number 3 shows how a typedef saves typing the
complicated description every time. It says “An fp3 is a pointer to a
function that takes no arguments and returns a pointer to an array of
10 pointers to functions that take no arguments and return doubles.”
Then it says “a is one of these fp3 types.” typedef is generally
useful for building complicated descriptions from simple ones.
Number 4 is a function declaration instead of a variable definition.
It says “f4 is a function that returns a pointer to an array of 10
pointers to functions that return integers.”
You will rarely if ever need such complicated declarations and
definitions as these. However, if you go through the exercise of
figuring them out you will not even be mildly disturbed with the
slightly complicated ones you may encounter in real life.

La sintassi di base per creare un puntatore a funzione č del tutto simile
ad una qualsiasi dichiarazione di funzione che restituisce un puntatore:
int* funzione(int); // funzione che restituisce un puntatore
int (*puntatore) (int); // le parentesi sono necessarie per indicare che *
č legato al nome stesso del puntatore                              // e non
al return type
 
Un modo alternativo (ed assai piů comodo) č tramite il typedef:
typedef int funzione(int); // dichiarazione di un tipo che prende un intero
e restituisce un intero.
funzione* puntatore;

altri esempi?
La regola che devi applicare e' quella di precedenza tra operatori *
() e [].
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

float (*(*fp2)(int,int,float))(int);
?
Non mi voglio soffermare su cosa definiscono, ma vorrei chiedere se un
libro per principianti o avanzato deve ridursi a scrivere questi
codici.Personalmente li giudico come illeggibili.
Finché si tratta di puntatori a funzioni vada, ma quando si comincia a
mescolare anche gli array credo che questo sia uno stile da evitare.
Mi sembra che questo sia uno dei casi in cui la typedef risulti il modo
migliore per procedere:
typedef float funzione(int);
funzione*(*puntatore) (int,int,float);

funzione*(*puntatore) (int,int,float);
La trovo piu' illeggibile delle prime.
Ma, ripeto : questione di gusti.
