Newsgroup: it.comp.lang.c++
Titolo: Chi mi può spiegare questa righa ?

Salve a tutti,
ho trovato in un programma questa dichiarazione di struttura:
typedef struct
 {  char *cmdname;
    int (*cmdfunc)(void); // QUA' MI PERDO: COSA SEVE IL (VOID) ?
 } CMDTAB;
Non riesco a capire cosa serve il (void) dopo la dichiarazione del puntatore
*cmdfunc. Qualcuno me l'ho può spiegare ?
E poi ancora:
double somma(double, double);
questo prototipo di funzione, quale significato hanno i due double senza un
nome di parametro ? Sembrerebbe quasi una dimenticanza ;-D
Grazie ancora per il vostro aiuto.

 nome di parametro ? Sembrerebbe quasi una dimenticanza ;-D
Si tratta solo di una dichiarazione, che serve a far sapere al compilatore
che tipo di parametri prende in ingresso la funzione somma: specificarne il
nome č opzionale. Quando invece implementi la funzione, specificare i nomi č
indispensabile, altrimenti non puoi riferirti ad essi nel corpo della
funzione (anche se in certi casi non il nome non va specificato, ma sono
casi specifici).
Ciao,
Cecco

 cmdtab.cmdfunc = f1;
Se cmdfunc č un puntatore , non dovrei avere  int  *f1(void)  e  int
*f2(void), cioč due funzioni che restituiscono un puntatore ?
 Grazie
Simone


Cesare

 *f2(void), cioè due funzioni che restituiscono un puntatore ?
Un puntatore a funzione si dichiara in questo modo:
<tipo di ritorno> (*nome)(<argomenti della funzione da puntare>)
Ad esempio:
int (*foo1)(void);    // punta ad una funzione che non accetta argomenti e
ritorna un intero
int* (*foo2)(int);     // punta ad una funzione che prende un intero e
ritorna un puntatore a intero
...
int f1(void);
int* f2(int);
...
foo1 = f1;    // ok
foo1 = f2;    // errore
foo2 = f1;    // errore
foo2 = f2;    // ok
Ciao,
Cecco


A questo punto credo di essermi confuso: int (*cmdfunc)(void) è una
dichiarazione di funzione o semplicemente una variabile puntatore ?

 foo2 = f2;    // ok
Capito l'inghippo: io conoscevo solo funzioni a cui si passano ad esempio
puntatori
e ritornano int (oppure char, double...)
Esempio          int somma ( int *a, int *b)
oppure funzioni a cui si passano puntatori  o parametri e restituiscono
puntatori
Esempio         int *somma (int a, int b)
non ero ancora a conoscenza della possibilità di avere un puntatore a
funzione.
Devi avere un pò di pazienza, perchè sono ancora in fase di apprendimento
;-D
Grazie
Simone

 dichiarazione di funzione o semplicemente una variabile puntatore ?
E' una variabile puntatore a funzione: in pratica serve per richiamare una
funzione all'interno di un algoritmo senza sapere a priori cosa fa la
funzione. Ti faccio un esempio: metti che vuoi fare una funzione (draw) che
plotti una determinata funzione matematica (func). Senza i puntatori a
funzione dovresti per forza fare una funzione specifica per ogni funzione
matematica che vuoi plottare, ad esempio draw_sin, draw_cos ecc... Con un
puntatore a funzione, il prototipo della draw diventerebbe:
void draw(int min, int max, double(*func)(double));
dove ho supposto che min e max siano gli estremi della funzione, e che la
funzione da plottare accetti e ritorni un double (in effetti molte delle
funzioni definite in <cmath> sono di questo tipo). Per richiamare la draw e
plottare una funzione tra 0 e 10, ad esempio, dovrai quindi fare:
draw(0, 10, sin);    // plotta la funzione sin
draw(0, 10, cos);   // plotta la funzione cos
e cosě via.
Una volta dichiarato il puntatore a funzione, lo utilizzi come se fosse una
funzione normale:
double res;
func = sin;
res = func(3.4);    // res = seno di 3.4
Ciao,
Cecco