View Full Version : [C++ sintassi] cosa vuol dire ?
void (*set_new_handler(void (*)(void)))(void);
cosa dichiara questo un puntatore di funzione di ...???
boo?!?!?!
preso da: http://en.wikipedia.org/wiki/Significantly_Prettier_and_Easier_C%2B%2B_Syntax
AnonimoVeneziano
16-11-2007, 15:26
Non vorrei dire una boiata, ma la dirò ugualmente :D
A me a prima vista sembra un puntatore a puntatore di funzione.
In pratica sembra che una funzione generi il puntatore alla funzione che deve essere effettivamente chiamata.
Ripeto però che di costrutti del genere ne ho visti davvero pochi e quindi potrei anche stare facendo una brutta figura nel dire ciò :D
tomminno
16-11-2007, 15:37
void (*set_new_handler(void (*)(void)))(void);
cosa dichiara questo un puntatore di funzione di ...???
boo?!?!?!
preso da: http://en.wikipedia.org/wiki/Significantly_Prettier_and_Easier_C%2B%2B_Syntax
set_new_handler riceve come parametro un puntatore a funzione void f(void) e restituisce un puntatore a funzione dello stesso tipo.
Quella è la dichiarazione in una sola espressione. Generalmente di usano i typedef.
grazie mitici adesso ho capito!!!
io nn riuscivo a capire l'ultimo "(void)"
void (*set_new_handler(void (*)(void)))(void);
e pensavo che set_new_handler fosse stato un puntatore a funzione....
invece no..... set_new_handler è una funzione !!
invece Facendo cosi:
void (*set_new_handler)(void (*)(void))
ho un puntatore a funzione che prende per parametro un puntatore a funzione!
altrimenti cosi :
void (*(*set_new_handler)(void (*)(void)))(void)
ho un puntatore a funzione che prende per parametro un puntatore a funzione e restituisce un puntatore a funzione!
Dovrei aver capito giusto ??
tomminno
16-11-2007, 17:05
grazie mitici adesso ho capito!!!
io nn riuscivo a capire l'ultimo "(void)"
void (*set_new_handler(void (*)(void)))(void);
e pensavo che set_new_handler fosse stato un puntatore a funzione....
invece no..... set_new_handler è una funzione !!
invece Facendo cosi:
void (*set_new_handler)(void (*)(void))
ho un puntatore a funzione che prende per parametro un puntatore a funzione!
altrimenti cosi :
void (*(*set_new_handler)(void (*)(void)))(void)
ho un puntatore a funzione che prende per parametro un puntatore a funzione e restituisce un puntatore a funzione!
Dovrei aver capito giusto ??
Tanti anni fa quando mi insegnarono il C, mi fecero un discorso strano per quanto riguarda la lettura delle dichiarazioni che ho assimilato come:
leggi il nome: set_new_handler
Procedi a destra fino a trovare una parentesi chiusa o il ;
set_new_handler(void (*)(void))
A questo punto si capisce che set_new_handler è una funzione che accetta un puntatore a funzione void f(void).
Trovando la parentesi chiusa bisogna ritornare a quello che precede il nome.
Siccome noi abbiamo capito che è una funzione, quello che precede il nome è il valore di ritorno e cosa ritorna? Esattamente un void(*)(void) ovvero un puntatore a funzione.
leggi il nome: set_new_handler
Procedi a destra fino a trovare una parentesi chiusa o il ;
set_new_handler(void (*)(void))
veramente con questo algoritmo otterresti:
set_new_handler(void (*)
tomminno
16-11-2007, 19:58
veramente con questo algoritmo otterresti:
set_new_handler(void (*)
Simpatico! :rolleyes:
Chiaro che non è un algoritmo e un essere umano è abbastanza intelligente da capire che la prima parentesi chiusa si riferisce all'ultima parentesi aperta che non è quella di interesse.
Simpatico! :rolleyes: :mbe:
Chiaro che non è un algoritmo e un essere umano è abbastanza intelligente da capire che la prima parentesi chiusa si riferisce all'ultima parentesi aperta che non è quella di interesse. così?
set_new_handler(void (*)(void)))(void)
tomminno
17-11-2007, 11:37
così?
set_new_handler(void (*)(void)))(void)
Hai messo una parentesi di troppo non ti pare?
Mi sembra che vuoi fare più polemica che altro.
La mia era solo una spiegazione spannometrica, senza nessuna pretesa di costituire nè un algortimo, nè di essere esaustiva. Sicuramente non è sbagliata.
Visto che sei più fresco di me quanto a lettura delle dichiarazioni C, perchè non posti l'algoritmo ufficiale?
Hai messo una parentesi di troppo non ti pare? no, non mi pare...
a quanto dici la prima parentesi chiusa si riferisce all'ultima parentesi aperta che non è quella di interesse. posto che non ho capito quand'è che una parentesi si definisce "di interesse", io direi che l'ultima parentesi aperta è questa:
void (*set_new_handler(void (*)(void)))(void);
quindi la parentesi chiusa che vi si riferisce è senza dubbio questa:
void (*set_new_handler(void (*)(void)))(void);
Visto che sei più fresco di me quanto a lettura delle dichiarazioni C, perchè non posti l'algoritmo ufficiale? io ovviamente non lo conosco visto che le specifiche del C sono a pagamento, come anche i libri che lo spiegano (pensa che per imparare quel linguaggio ne ho dovuto intuire la sintassi leggendo quello che trovavo in internet, tra tutorial e codici di esempio; MSDN l'ho scoperta dopo), ma questo non mi vieta di fare delle osservazioni indipendenti dal linguaggio.
tomminno
17-11-2007, 13:44
no, non mi pare...
a quanto dici la prima parentesi chiusa si riferisce all'ultima parentesi aperta che non è quella di interesse. posto che non ho capito quand'è che una parentesi si definisce "di interesse", io direi che l'ultima parentesi aperta è questa:
void (*set_new_handler(void (*)(void)))(void);
quindi la parentesi chiusa che vi si riferisce è senza dubbio questa:
void (*set_new_handler(void (*)(void)))(void);
Ripremesso che quello che ho scritto non è un algoritmo nè pretende di essere esaustivo.
Non so come vengano parserizzate tali dichiarazioni dal parser, a me hanno insegnato a leggerle così: si parte dal nome e si prosegue a destra fino a trovare una parentesi tonda chiusa che non abbia come riferimento una parentesi aperta o il ; quindi si legge a sinistra del nome fino a trovare una parentesi aperta o l'inizio dell'espressione. La parentesi aperta comporta che bisogna tornare a leggere a destra tutti i caratteri non ancora presi in considerazione. E così via fino a che non si sono consumati tutti i caratteri dell'espressione.
(ok forse questo è un algoritmo :D )
Partendo dall'espressione
void (*set_new_handler(void (*)(void)))(void);
Individuato il nome "set_new_handler" (come si individua il nome? boh, a intuito la seconda sequenza di caratteri ammissibili per un nome di variabile o funzione, anche se in C c'è la possibilità di non specificare il tipo dichiarandolo implicitamente int, quindi non una regola generale),
Subito dopo si trova una parentesi aperta, questa set_new_handler( è la parentesi aperta di interesse, bisogna scorrere l'espressione fino a trovare la prima parentesi chiusa che non abbia come corrispondente nessuna parentesi aperta.
La presenza della parentesi tonda fa capire che è una funzione, all'interno c'è una sequenza void (*)(void) prima di incontrare la parentesi chiusa che racchiude tutto l'argomento e che è relativa alla parentesi aperta che stiamo prendendo in considerazione.
La parentesi successiva set_new_handler(void (*)(void))) indica che bisogna tornare a leggere quello che c'è scritto prima del nome.
Prima del nome troviamo * che indica puntatore, quindi set_new_handler riceve come parametro un puntatore a funzione e restituisce un puntatore.
Puntatore di che tipo? La "regola" vuole che si continui a leggere verso sinistra fino a trovare o l'inizio dell'espressione o una parentesi aperta.
Trovando quindi la parentesi aperta void (*, questo indica che set_new_handler restituisce un puntatore a funzione visto che * è contenuto tra 2 parentesi tonde. La parentesi aperta obbliga a tornare a leggere verso destra a partire dalla parentesi chiusa set_new_handler(void (*)(void))), in quanto questa è già stata presa in considerazione . Quindi troviamo l'argomento (void) e la fine dell'espressione che obbliga a leggere nuovamente a sinistra che ci porta ad incontrare un bel void.
Quindi abbiamo un puntatore a funzione, sappiamo che quello che è a destra è l'argomento e quello che è a sinistra è il valore restituito, quindi set_new_handler restituisce un puntatore a funzione che accetta void e restituisce void.
io ovviamente non lo conosco visto che le specifiche del C sono a pagamento, come anche i libri che lo spiegano (pensa che per imparare quel linguaggio ne ho dovuto intuire la sintassi leggendo quello che trovavo in internet, tra tutorial e codici di esempio; MSDN l'ho scoperta dopo), ma questo non mi vieta di fare delle osservazioni indipendenti dal linguaggio.
Continuo a non capire se mi stai prendendo in giro o no.
Siccome di programmazione ne sai probabilmente più di me, continuo a pensare che lo fai apposta, visto che se lo hanno insegnato a me nell'unico corso dove hanno spiegato qualcosa di programmazione, sicuramente l'hanno spiegato anche a te.
sono pigro, non voglio leggere :D
ci ho provato più volte, ma tutte le volte mi perdo verso metà. rispondo solo a questo:
Continuo a non capire se mi stai prendendo in giro o no.
Siccome di programmazione ne sai probabilmente più di me, continuo a pensare che lo fai apposta, visto che se lo hanno insegnato a me nell'unico corso dove hanno spiegato qualcosa di programmazione, sicuramente l'hanno spiegato anche a te. io chiedo e basta :O
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.