|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
[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/Signifi...C%2B%2B_Syntax |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Non vorrei dire una boiata, ma la dirò ugualmente
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ò
__________________
GPU Compiler Engineer |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quella è la dichiarazione in una sola espressione. Generalmente di usano i typedef. Ultima modifica di tomminno : 16-11-2007 alle 16:44. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
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 ?? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
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. |
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
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. |
|
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
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? |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
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); Quote:
|
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
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 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. Quote:
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. |
||
|
|
|
|
|
#12 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
sono pigro, non voglio leggere
ci ho provato più volte, ma tutte le volte mi perdo verso metà. rispondo solo a questo: Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:49.





















