PDA

Visualizza la versione completa : [C, esperti] deferenziazione di void *.... non li ho capiti...


xnavigator
24-05-2010, 23:52
ragazzi ho scritto un paio di righe di codice per gestire dei threads. Il problema che non riesco a capire sti benedetti puntatori a void.

Vi posto la porzione di codice che uso.

Ho una funzione che uso per generare un nuovo thread.



void *myThreadFunc(void *args) {
int value;
// calcolo della variabile 'value', poi la passo con pthread_exit
pthread_exit((void *)value);
}


Gi la non capisco cosa succede. Cio io ho un valore intero (int value) conservato in un dato spazio di memoria X, e con quel cast a void praticamente gli passo alla funzione pthread_exit l'indirizzo di memoria X per come se all'interno il dato fosse di tipo void?
Se ho detto bene allora non si dovrebbe fare cosi: ?



pthread_exit((void)&value);


Poi nel main ad un certo punto avr:


void *thread_value_return;
pthread_join(my_thread_id,&thread_value_return);
printf("Il valore ritornato e': %d.",(int)thread_value_return);


Il secondo argomento della join specificato come doppio puntatore a void, quindi devo anteporre & per ottenere 2 indirizzi.

Ora quello che non capisco perch devo fare (int)thread_value_return per accedere al valore intero, thread_value_return non rappresenta un puntatore?

Non dovrei fare
(int)*thread_value_return?

chiss se qualcuno mi aiuter :(

MItaly
25-05-2010, 00:13
void * un tipo che non vuol dire nulla; indica un generico puntatore, e in questo genere di funzioni si suppone che il programmatore sappia quello che faccia quando lo casta ad altri tipi di puntatore; in questo caso specifico in realt poi usato come un intero (dato che in fondo i puntatori sono degli interi), per cui il codice di errore convertito "a pedate" in un void * e viceversa.

xnavigator
25-05-2010, 01:06
Originariamente inviato da MItaly
void * un tipo che non vuol dire nulla; indica un generico puntatore, e in questo genere di funzioni si suppone che il programmatore sappia quello che faccia quando lo casta ad altri tipi di puntatore; in questo caso specifico in realt poi usato come un intero (dato che in fondo i puntatori sono degli interi), per cui il codice di errore convertito "a pedate" in un void * e viceversa.

non ho capito cosa vuoi dire.



void *thread_value_return;
pthread_join(my_thread_id,&thread_value_return);
printf("Il valore ritornato e': %d.",(int)thread_value_return);


per come definito ti trovi che thread_value_return una variabile che contiene un indirizzo di memoria?

perch (int)thread_value_return mi ritorna il valore intero a cui punta l'indirizzo contenuto nella variabile non lo capisco :dh:

oregon
25-05-2010, 09:50
A parte il fatto specifico (di quello che stai facendo), probabilmente tu non hai chiaro il concetto di void.

xnavigator
25-05-2010, 11:19
Originariamente inviato da oregon
A parte il fatto specifico (di quello che stai facendo), probabilmente tu non hai chiaro il concetto di void.

grazie per la spiegazione :mame:

oregon
25-05-2010, 11:44
Originariamente inviato da xnavigator
grazie per la spiegazione :mame:

Prego.

Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice

"non ho capito cosa vuoi dire."

molto probabilmente che tu abbia delle "lacune" di base. Ecco quindi che ti chiedevo (anche se la domanda non era esplicita) se tu avessi tali nozioni ...

Sai cosa un void?

xnavigator
25-05-2010, 12:01
Originariamente inviato da oregon
Prego.

Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice

"non ho capito cosa vuoi dire."

molto probabilmente che tu abbia delle "lacune" di base. Ecco quindi che ti chiedevo (anche se la domanda non era esplicita) se tu avessi tali nozioni ...

Sai cosa un void?


un puntatore a void non una cosa cosi complicata da capire.. E' un puntatore che pu puntare ad un qualsiasi tipo.

Il problema che non mi entra quel passaggio:
(int)thread_value_return

thread_value_return un puntatore a void, quindi per prendere l'intero che puntato dal puntatore io avrei fatto cosi:
(int)*thread_value_return



Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice


hm, in effetti rileggendo mitaly con pi attenzione con quel codice praticamente al posto dell'indirizzo vero e proprio thread_value_return contiene proprio il valore int e non un indirizzo :dh: :dh:

che brutto codice :dh:

a questo punto non mi ben chiaro perch la funzioen pthread_join ha definito come secondo argomento un doppio puntatore a void

int pthread_join (pthread_t TH, void **thread_RETURN)

thx comunque

antotan
25-05-2010, 12:05
Originariamente inviato da xnavigator
un puntatore a void non una cosa cosi complicata da capire.. E' un puntatore che pu puntare ad un qualsiasi tipo.

Il problema che non mi entra quel passaggio:
(int)thread_value_return

thread_value_return un puntatore a void, quindi per prendere l'intero che puntato dal puntatore io avrei fatto cosi:
(int)*thread_value_return


void* quasi quello che vuoi tu, non per forza un puntatore.
Dai un'occhiata qui:

http://forum.html.it/forum/showthread.php?s=&threadid=1395258

:ciauz:

Loading