Newsgroup: it.comp.lang.c
Titolo: Come lo interpreto?

Ciao a tutti!
Spero di non essere troppo OT (sempre di C si tratta ma l'esempio e' 
relativo alle glib...)...il mio problema e' il seguente ...come 
interpreto il seguente prototipo:
GList*      g_list_find_custom              (GList *list,
                                              gconstpointer data,
                                              GCompareFunc func);
dove GCompareFunc risulta:
gint        (*GCompareFunc)                 (gconstpointer a,
                                              gconstpointer b);
In pratica ho pensato a qualcosa del tipo...g_list_find_custom   si 
aspetta come terzo parametro un puntatore a funzione del tipo indicato 
da GCompareFunc ...sono sulla strada giusta o non ho capito nulla?
Vedendo poi un po' di esempi sui puntatori a funzioni ho notato il nome 
di una funzione costituisce il suo indirizzo...e' corretto?
Ciao e grazie!
Aragorn

                                              gconstpointer b);
Tanto per aumentare il livello di difficolta' aggiungo che nell'header 
glib.h c'e' la seguente typedef
typedef gint (*GCompareFunc) (gconstpointer a,gconstpointer b);
ma che significato ha questa espressione? Non e' del tipo
typedef long int CIAO;
Ciao e grazie
Aragorn

 ha scritto nel messaggio
news:44cd4c45$0$47963$4faf...@reader3.news.tin.it...

typedef serve a dare un nuovo nome ad un tipo esistente.
con
    typedef long int CIAO;
indichi che CIAO è sinonimo di 'long int'.
Notare che il nome creato con typedef appare nella posizione della variabile
e non subito dopo il typedef stesso.
idem con typedef gint (*GCompareFunc) (gconstpointer a,gconstpointer b);
GCompareFunc diventa effettivamente un sinonimo di:
puntatore a funzione che prende due gconstpointer e torna gint.
Il nome dichiarato anche questa volta appare nella posizione
del nome di variabile.
In pratica per creare un nome typedef è utile fare la seguente
considerazione: mi faccio aiutare da come poi la variabile
dichiarata con il nuovo nome dovrà essere usata.
Es:
Supponiamo che devo creare un nuovo nome per
una variabile che voglio usare in questo modo:
(*fun[3])(3,4) e voglio che questo sia un double.
Quindi posso fare un typedef così:
typedef double (*Fun)(int,int);
e poi
/* array di funzioni */
Fun fun[] = {
    ...
    /*
        almeno 4 funzioni di tipo Fun, cioè
        che prendono due int e tornano double
    */
    ...
};
Così facendo ho (*fun[3])(3,4) di tipo double, quello
che volevo.
Quindi per il typedef mi sono fatto aiutare dall'uso stesso della
variabile.
--
Giorgio Silvestri
DSP/Embedded/Real Time OS (RTOS) Software Engineer

 puntatore a funzione che prende due gconstpointer e torna gint.
Ciao, grazie come sempre per le spiegazioni...c'e' ancora una cosa che 
mi resta un po' oscura...in pratica pensavo che il typedef fosse piu' 
stupido...del del tipo prende tutto l'ultima parola (CIAO in questo 
caso) e la rende sinonimo di tutto quello che c'e' prima.
In
typedef gint (*GCompareFunc) (gconstpointer a,gconstpointer b);
l'ultima parola pero' non c'e' ...come fa il typedef ad eseguire 
l'associazione tra GCompareFunc e "gint (*GCompareFunc) (gconstpointer 
a,gconstpointer b)"?
io mi sarei aspettato qualcosa del tipo
typedef gint (*GCompareFunc) (gconstpointer a,gconstpointer b) GCompareFunc
Grazie ancora !
Aragorn


In "pratica", senza voler essere troppo preciso (meglio un libro a questo
punto)
l'uso del typedef č il seguente:
typedef D;
con D una dichiarazione.
Supponi di non avere i typedef.
Per dichiarare una variabile puntatore a funzione come faresti ?
cosě:
void (*funcptr)(int a,int b);
mentre se ci metti typedef davanti:
typedef void (*funcptr)(int a,int b);
definisci un nuovo nome per un tipo, relativo all'identificatore esplicitato
dalla dichiarazione.
Quindi nel punto dove la dichiarazione D definisce una nuovo identificatore
allora typedef D definisce un sinonimo per un tipo.
Questa č in definitiva la "connessione/associazione".
La sintassi quindi ricalca quella delle dichiarazioni.
Capite quelle ... ci metti typedef davanti!  :-)


 Capite quelle ... ci metti typedef davanti!  :-)
K&R ha tentato di spiegarmelo in 1000 modi ma non c'e' mai riuscito , 
sei un mito! In pratica quindi faccio una dichiarazione normale e il suo 
nome sara' quello utilizzato dal typedef per il nuovo tipo, e' corretto?
Ciao e grazie 1000
Aragorn

 ha scritto nel messaggio
news:44cdfb22$0$35077$4faf...@reader4.news.tin.it...

Praticamente sì.


 typedef long int CIAO;
E' dello stesso tipo ;) La sintassi può risultatare un po' aliena, ma è
una normale typedef.
Il tipo è gint (*)(gconstpointer, gconstpointer) (ovvero puntatore a
funzione che restituisce un gint ed accetta due gconstpointer), ed il
suo alias è GCompareFunc.
Luca
-- 
Home: 
http://kronoz.cjb.net
La vispa candela bruciava l'erbetta
creando un'essenza alquanto sospetta;
sembrava l'odore di una sacrestia
ma presto mi accorsi che era maria.

 Luca
Grazie 1000 sia a te che a Giorgio!
Ciao
Aragorn