Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-11-2007, 14:58   #1
tglman
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
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 15:26   #2
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
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
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 15:37   #3
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da tglman Guarda i messaggi
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
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.

Ultima modifica di tomminno : 16-11-2007 alle 15:44.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 16:40   #4
tglman
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 ??
tglman è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 17:05   #5
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da tglman Guarda i messaggi
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 17:09   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da tomminno Guarda i messaggi
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 (*)
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2007, 19:58   #7
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da 71104 Guarda i messaggi
veramente con questo algoritmo otterresti:
set_new_handler(void (*)
Simpatico!
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2007, 06:18   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Simpatico!


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.
così?
set_new_handler(void (*)(void)))(void)
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2007, 11:37   #9
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2007, 12:00   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da tomminno Guarda i messaggi
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);


Quote:
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.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2007, 13:44   #11
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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 )

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:
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2007, 19:20   #12
71104
Bannato
 
L'Avatar di 71104
 
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:
Originariamente inviato da tomminno Guarda i messaggi
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
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Samsung ed Sk hynix, i bonus per gli ope...
Windows 11 velocizza Esplora File: ecco ...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
Fastweb scompare dai partner Starlink Mo...
Huawei anticipa tutti con Pura X Max: il...
Amazon Tech Week 2026: RTX 5000, process...
Grandi offerte Amazon su scope elettrich...
Amazon e Anthropic rafforzano la partner...
Elden Ring: il film arriverà fra ...
Mercato PC, +3,2% nel Q1 2026: Lenovo se...
Corsair Platform: scrivanie gaming modul...
Assassin's Creed Black Flag Resynced: Ub...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:08.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v