PDA

View Full Version : [C] un callback con void* come parametro


Duchamp
27-05-2010, 19:47
Buona sera.
Vorrei realizzare una funzione callback alla quale si possa passare un puntatore a void, un po' come si fa al momento di una creazione di un thread POSIX. Questo mi permetterebbe di passarci tutto quello che mi pare, in particolare una struct se ho più variabili.
Nel mezzo pseudocodice che segue ho riportato il test più recente che sto effettuando, grazie al quale mi sorge un dubbio: come faccio a passare la struttura st al callback "attraverso" func? Forse quest'ultima dovrebbe possedere anch'essa un puntatore a void, in aggiunta al callback? Ma soprattutto: è questa la via giusta da intraprendere?


void func( void (*callback)(void*) );
void callback( void * );
main()
{
struct st;
func( &callback );
}

void func( void (*callback)(void*) ) {
// qui chiamo la funzione callback
}

void callback( void * ) {
// faccio il cast da void* al necessario e uso i dati
}


Sperando di non aver generato confusione, ringrazio chiunque se la senta di darmi una mano ;)

DanieleC88
27-05-2010, 20:30
No, quel parametro non glielo puoi passare. O, sì, potresti passarglielo, ma dovresti fare una cosa del tipo:


dichiaro una funzione che riceve un puntatore a funzione che accetta un puntatore a struct e un puntatore a struct;
all'interno di questa, chiamo la funzione di callback dandogli in input il secondo parametro ricevuto (il puntatore a struct)


O rendi globale la struttura... Magari no. :D

Duchamp
27-05-2010, 20:38
Ciao, gentilissimo per la risposta.
Quindi, secondo il tuo suggerimento, la "func" deve diventare da

void func( void (*callback)(void*) );


a

void func( void*, void (*callback)(void*) );


ho compreso? Effettivamente mi sembra molto logico, altrimenti la struct non può "compiere il passaggio" dal main al callback.

Un'ultima considerazione: essendo void* puntatori "al niente", possono essere considerati facoltativi nel caso non dovessi passare nessun parametro?


O rendi globale la struttura... Magari no. :D

No grazie :D

DanieleC88
27-05-2010, 21:31
ho compreso?
Sì, intendevo una cosa di quel tipo. :)
Un'ultima considerazione: essendo void* puntatori "al niente", possono essere considerati facoltativi nel caso non dovessi passare nessun parametro?
Eh, purtroppo no. Per i parametri opzionali in C devi fare un giretto un po' contorto che passa per lo stack di sistema. Qui c'è qualcosa in più (http://en.wikipedia.org/wiki/Stdarg.h), se sei interessato.

Duchamp
27-05-2010, 21:49
Eh, purtroppo no. Per i parametri opzionali in C devi fare un giretto un po' contorto che passa per lo stack di sistema. Qui c'è qualcosa in più (http://en.wikipedia.org/wiki/Stdarg.h), se sei interessato.

Ops mi sono spiegato male, non intendevo parametri il cui numero è variabile, bensì NULL se non necessari.
Esempio: in un certo momento del programma devo chiamare "func" ma non mi interessa passargli nessun dato: è lecito chiamarla come segue?


func( NULL, &callback );

DanieleC88
27-05-2010, 21:51
Be' sì, questo è possibile. ;)
Però nel tuo caso arriverà un NULL anche alla funzione di callback. Anche se penso che in quel caso non ti interessi molto. :)

Duchamp
27-05-2010, 22:05
Yes, e al massimo si fanno i controlli del caso.
Ti ringrazio moltissimo per il supporto! :cincin:

DanieleC88
27-05-2010, 22:19
E di che. ;)