PDA

View Full Version : [C] Confusione su puntatori a funzione e uso del void!!


mech666
20-01-2011, 10:14
Salve a tutti eccomi di nuovo qua con un nuovo dubbio, spero che anche oggi come ieri potete aiutarmi...sto usando la libreria "pthread" ma siccome è un pò che non uso il C sto andando in confusione sulla dichiarazione della funzione che crea i thread, eccola qui:

int pthread_create(pthread_t * thread,
const pthread_attr_t * attr,
void * (*start_routine)(void *),
void *arg);


Il problema è in come passo a thread la funzione che dovrà eseguire, quindi in:

void * (*start_routine)(void *)

Vediamo se ho capito almeno qualcosa, allora in questa parte:

* (*start_routine)

Si dice che devo passare un puntatore a funzione, e che questa può ritornare un puntatore a funzione, ma i due void come vanno interpretati???

Nella mia ignoranza credo che il primo significhi che la funzione può anche non ritornare nulla, mentre il secondo tra parentesi dovrebbe significare che posso non passare argometi alla funzione???

Vi prego datemi qualche delucidazione!!!

P.S. Riguardo ad void *arg invece cosa potete dirmi???

Grazieee!!!!!

tuccio`
20-01-2011, 10:29
vuol dire che la funzione che devi passare deve ritornare un void* e prende come argomento un void*

arg è l'argomento che verrà passato alla funzione al momento del lancio del thread

essendo void* in entrambi i casi, puoi fare un po' quello che vuoi, perché puoi castare ogni tipo di puntatore a void* e poi ricastare il void* al tipo opportuno

se ad esempio come argomento hai bisogno di un certo numero di argomenti e non te ne basta uno, puoi definire una struct e passare quella come argomento (castandola a void*), dopo di che come prima operazione nella routine del thread casti l'argomento al puntatore alla tua struct

mech666
20-01-2011, 10:41
Ti ringrazio tuccio!

Solo che non ho ben capito come funziona il void*, potresti farmi un esempio usando come hai detto tu una struct?

Ma in pratica, sto void* è un pò come il tipo object della programmazione ad oggetti che può contenere qualsiasi cosa??

Grazie ancora!