Newsgroup: it.comp.lang.c
Titolo: equivalenza di void* e long

Salve,
qualcuno sa se nello standard C i tipi long e void* hanno sempre le
stesse dimensioni ??
In altre parole, e' sempre equivalente per memorizzare puntatori usare
un long (e poi usare un cast quando serve) o un void* ??
Devo scrivere codice molto portabile.
-- 
Andrea Vettori
------------------------
vet...@computer.org
http://www.dei.unipd.it/~vettori
    (italiano)
http://www.geocities.com/ResearchTriangle/9236
   (english)

 E per quale cavolo di motivo vuoi fare uno schifo del genere?
Non e' che lo voglio fare perche' mi piace ... 
Ho la necessita' di memorizzare liste di long e liste di void*.
Se fosse possibile vorrei usare lo stesso codice per gestire entrambe.


Andrea Vettori (
vet...@dei.unipd.it
) wrote:
: Salve,
: qualcuno sa se nello standard C i tipi long e void* hanno sempre le
: stesse dimensioni ??
: In altre parole, e' sempre equivalente per memorizzare puntatori usare
: un long (e poi usare un cast quando serve) o un void* ??
: Devo scrivere codice molto portabile.
E per quale cavolo di motivo vuoi fare uno schifo del genere?
Usa void* e long quando devono essere correttamente utilizzati,
ed evita questi cast da brivido e perfettamente fuori luogo.
Anche perche' e' l'unico modo di scrivere codice portabile....
--
F. Lovergine (f.lov...@iesi.ba.cnr.it.REMOVE.THIS.BEFORE.REPLY)
PLEASE, REMOVE ANTI-SPAM SUFFIX BEFORE REPLY

Se fosse possibile vorrei usare lo stesso codice per gestire entrambe.
e perch=E9 non usi qualcosa del tipo sizeof(long) e sizeof(void)? =
Ovviamente, dato che non puoi fare qualcosa del tipo=20
     char array_puntatory[sizeof(long)]
puoi sempre allocare memoria dinamicamente...
(void*)
ic...@mindless.com
http://www.netcafe.interbusiness.it/users/icaro

Andrea Vettori (
vet...@dei.unipd.it
) wrote:
: Francesco P. Lovergine wrote:
: > 
: > Andrea Vettori (
vet...@dei.unipd.it
) wrote:
: > : Salve,
: > 
: > : qualcuno sa se nello standard C i tipi long e void* hanno sempre le
: > : stesse dimensioni ??
: > 
: > : In altre parole, e' sempre equivalente per memorizzare puntatori usare
: > : un long (e poi usare un cast quando serve) o un void* ??
: > 
: > : Devo scrivere codice molto portabile.
: > 
: > E per quale cavolo di motivo vuoi fare uno schifo del genere?
: Non e' che lo voglio fare perche' mi piace ... 
: Ho la necessita' di memorizzare liste di long e liste di void*.
: Se fosse possibile vorrei usare lo stesso codice per gestire entrambe.
:   
E secondo te e' necessario una cosa del genere per gestire una lista??
Se vuoi una soluzione elegante usa il c++, altrimenti: le union 
secondo te le hanno inventate per sport? ;-)


Andrea,
I tipi "void *" e "long" non sempre hanno la stessa dimensione.
- "void *" dipende dal modello di memoria  e, su sistemi x86, puo' occupare
2 o 4 byte;
- "long" occupa 4 byte (anche se almeno in teoria doveva essere il doppio di
"int").
Per non doverti preoccupare di questo per gestire la tua lista puoi
utilizzare una "union", ad esempio in questo modo.
typedef struct
{
   int type;
   union
   {
      void *pointer;
      long  number;
   } data;
} Item;
In questo modo "data" contiene il tuo elemento generico, mentre usi
"pointer" e "number" quando sei sicuro del tipo di dato che vuoi recuperare.
A questo proposito, se credi, puoi usare "type" per indicare cosa contiene
il generico elemento.
Come potrai vedere "data" ha dimensioni pari al massimo tra quelle di
"pointer" e "number" o eventualemente altre che potresti voler aggiungere in
seguito.
Alla prossima.
Ciao, Angelo.
----------
Rimuovere la protezione anti-spam dall'indirizzo di posta prima di
rispondere. Grazie.
Please remove anti-spam protection from my e-mail address before answering.
Thank you.
----------

 
La lista e' implementata dalla classe list della libreria libg++
(compilatore GCC).
Non ho usato la union perche', se possibile, mi sembra piu' comodo usare
il casting.
Ora: per favore, sai se void* e long hanno sempre la stessa dimensione
(secondo me quella di una word) ??
P.S.
Non uso DOS (niente modelli di memoria small, compact, large ecc.) ma
unix su pc-ibm, hp, sun e dec.


 utilizzare una "union", ad esempio in questo modo.
Questo e' vero. Ci avevo pensato ma mi pare piu' comodo, se possibile,
usare la soluzione del casting. 


 
Le routine di gestione sono gia' pronte :) uso la classe list della
libreria libg++ (compilatore GCC).


usare la soluzione del casting.
Ma sei sicuro che sia piu' comodo? Secondo me usando una "union" metti
d'accordo le due esigenze: portabilita' e compattezza della struttura dati.
Inoltre puoi indirizzare direttamente sia l'elemento del tipo specifico
oppure l'elemento generico.
Naturalmente lascio a te il giudizio finale.
Ciao, Angelo.

ho chiesto). 
Lo standard ansi non dice nulla sulla dimensione "assoluta" dei tipi.
si limita a dare delle relazioni tipo
sizeof(short)<=sizeof(int)<=sizeof(long)
ci sono poi delle convenzioni, ma non la sicurezza...
se vuoi fare codice veramente portabile, non basarti su di esse...
e poi i cast long e void*  mi ricordano molto quel poco che so di
WinAPI e che non mi piace molto (ma qui non voglio introdurre una
nuova discussione, non picchiatemi per questo commento)
Carlo
PS per rispondere, togliere UHHU dall'indirizzo