Newsgroup: it.comp.lang.c++
Titolo: <reinterpret_cast> in Visual C++ 6

Ciao a tutti.
Qualcuno mi sa dire perche' non riesco a fare il suddetto cast?!?
Io voglio passare da un puntatore a funzione ad un puntatore ad integer
(perche' c'è un passaggio obbligato e mi serve così) per poi farlo tornare
un puntatore a funzione.
Però non riesco a compilare!
Mi da' un errore del tipo solito
  can't convert from qualcosa* to qualcosaltro* ...
Ciao!
--
+------------------------------
+ Davide Gastaldi
+ mailto:
gda...@libero.it
+ ----------
+ "Certi sogni sono come le stelle: irraggiungibili...
+   pero` quanto e` bello alzare gli occhi, e vedere che son sempre la`..."
+------------------------------

 
Credo (spero di non dire una sciocchezza) che il cast tra puntatore a
funzione e puntatore ordinario non sia proprio possibile con la sintassi
speciale del C++ (nemmeno con reinterpret_cast<>). La sintassi del C
dovrebbe comunque funzionare.
Max


 
Aggiungo una cosa.
Non so se sia conforme allo standard ma se si passa da un cast a
int intermedio il mio compilatore (gcc) non dà nè errore nè warning.
 typedef int (* int_func)();
 void* p;
 int_func fp = reinterpret_cast< int_func >(p); // errore!
 int_func fp = reinterpret_cast< int_func >(    // ok
           reinterpret_cast< int >( p ) );
 
Max


Aggiungo una cosa.
Non so se sia conforme allo standard ma se si passa da un cast a
int intermedio il mio compilatore (gcc) non dą nč errore nč warning.
Sei completamente fuori-standard, nel senso che ogni compilatore
fara` quel che capita.  Se gli int non sono abbastanza lunghi per
tenere l'uno o l'altro dei puntatori, ad esempio, ti perderai
semplicemente e silenziosamente un tot di bit.
Alex


E se invece di un int uso un long? Perdo ugualmente dati? Il long coincide
(e coincidera`) sempre con la lunghezza di un indirizzo, o e` solo una
situazione temporanea dovuta all'indirizzamento a 32 bit (che andra`, per
dire, a farsi friggere se un giorno si usasse un indirizzamento a 64 bit?!?)
Davide


Ecco, questa e` una cosa che non capisco: perche` ti da errore? Un puntatore
di tipo void* non dovrebbe essere un tipo "universale"? Non si dovrebbe
poter fare cast da questo a qualsiasi altro puntatore e viceversa?
A meno che il problema non stia nel fatto che in questo caso il
reinterpret_cast e` superfluo...
Dopo questa considerazione, il mio compilatore mi da` un errore che
veramente fatico a comprendere... se hai tempo ti invito a leggere il mio
post "cast da puntatore a funzione a void* : errore incomprensibile?" che
tra l'altro ho gia` postato (con un altro nome) oggi pomeriggio, ma che
dev'essere andato perso in giro per il Poli :-)
Ciao!

 wrote in message
FlT_4.107429$VM3.7...@news.infostrada.it...

Non ci sono garanzie (ma se sei fortunato, un long potrebbe allora
pure essere a 64 bit; cosi` funziona da anni su Alpha).
In generale, non ci sono buone ragioni per approcci cosi` di basso
livello se non per software di tipo "device-driver" o comunque
strettamente legato ad un dato ambiente; spesso, quindi, si sceglie
di sacrificare la portabilita`, per quei rarissimi casi che richiedono
appunto discorsi cosi` "vicini al ferro" come reinterpret_cast.
Alex

 poter fare cast da questo a qualsiasi altro puntatore e viceversa?
No, esclusivamente a e da indirizzi di *DATI*.  Nulla garantisce
che void* possa contenere indirizzi di *FUNZIONI*.
Alex