Newsgroup: it.comp.lang.c
Titolo: problema con parametro void*

Premetto che è la prima volta che ho a che fare con questo tipo di
oggetti, per tale motivo ho dei grossi dubbi su come utilizzarli.
Vi spiego la situazione.
Ricevo come paramentro di una funzione un vettore di strutture , dove
la struttura è costituita da due campi:
strcut esempio
{
   char nome[100];
   void* valore;
}
ora io ho la necessità di scrivere il contenuto di "valore"
all'itnerno di un file con una fwrite.
Visto che il prototipo della fwrite accetta come primo parametro è un
void* non ho fatto nessun cast e il compilatore non si lamenta. E'
corretta una cosa del genere ?
Questa è la prima domanda.
La seconda domanda è:
Ad un certo punto ho la necessità di trasformare il contenuto di
valore in network byte order usando htonl, ma non so ome scriverlo
perchè mi dà sempre warning.
Qualche anima pia potrebbe spiegarmi questi benedetti puntatori a void
? ... e possibilmente rispondere alle due domande ?

scuffio ha scritto:

Non c'è nessuno  ? ? ?

 Non c'è nessuno ?
Mica siamo pagati per dare aiuto in tempo reale.
Luca
-- 
Home: 
http://kronoz.cjb.net
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein

 perchè mi dà sempre warning.
htonl() accetta un unsigned long non un puntatore. Non farti ingannare
dal fatto che su un comune PC i due tipi occupano 4 byte, sono due cose
diverse!
Nota che convertire un puntatore in un intero (ad esempio con (unsigned
long)ptr) è un operazione "implementation-dependent": il valore
ottenuto puo' anche non essere un intero valido. Anche se ti sembra che
"funzioni" NON FIDARTI!
Forse se ci descrivi cosa vuoi realizzare capiamo meglio come aiutarti!
Ciao!
Remo D.

rden...@gmail.com
 ha scritto:

Razie mille remo delle tue spiagazioni ! Ho un'altra domanda :
Devo prelevare da un file un'informazione e memorizzarla in una
variabile di tipo void* value.
La fread che utilizzo è la seguente:
 fread(FieldValue[i].value,FieldData[infopos.pos].FieldLen,1,info.fp)
La questione è che value non si riempie per nullae sinceramente vorrei
evitare di usare una varibile d'appoggio. C'è bisogno di un cast ?

 La questione è che value non si riempie per nulla
Permettimi di dirti che la tua confusione nasce dal non aver compreso
il fatto fondamentale che un (void *) è un puntatore quindi o
FieldData[infopos.pos].FieldLen è uguale a sizeof(void *) oppure
quello che hai scritto non è quello che volevi fare.
COMMENTO FINALE:
UN (void *) E' UN PUNTATORE "GENERICO". PRIMA DI USARLO DEVI FARE UN
CAST PER FARLO DIVENTARE UN PUNTATORE AD UN QUALCHE TIPO DEFINITO.
ESEMPIO
 struct {
   int a;
   void *data;
 } stru;
 int k;
 ....
 stru.data = malloc(sizeof(int)); /* facciamo spazio! */
 *((int *)stru.data) = 3423;     /* memorizziamo qualcosa */
 fwrite(stru.data,sizeof(int),1,f);    /* scriviamo 3423 su file */
 .... /* facciamo qualcos'altro tra cui chiudere
 ....    il file f e riaprirlo in lettura. */
 fread(&k,sizeof(int),1,f);   /* leggiamo un intero e mettiamolo in k
*/
 
Remo D.

 > La questione è che value non si riempie per nulla
Ho dimenticato di farti notare che se avessi voluto leggere il VALORE
di value avresti dovuto scrivere &FieldValue[i].value. Ma a questo
punto te ne sarai già accorto ...
Remo D.