PDA

View Full Version : C: tipo di ritorno, funzione


Dark Phoenix
05-06-2007, 22:34
Vi chiedo aiuto!
è una vita che cerco questa cosa ma non la trovo da nessuna parte....

Vorrei, per pulizia di codice, far tornare come tipo di ritorno e sottolineo come tipo di ritorno un bel puntatore ad una funzione ma non ci riesco e non ne conosco la sintassi corretta.
Logicamente non voglio far tornare da una procedura un puntatore a void per poi fare il cast... sapete per caso come si può fare?

negli argomenti una funzione la possiamo definire così void (*nome_funz) (parametri) ma nel tipo di ritorno come si può fare?

PS.
non ho detto il linguaggio... logicamente come da titolo è il C

PGI-Bis
05-06-2007, 23:05
Puoi dichiarare un tipo, genere:

typedef void (*fun)(int);

e poi usare quello come tipo restituito dalla funzione che restituisce una funzione:

fun getFun() { ... }

Credo si possa fare anche senza typedef ma è più che altro un sospetto perchè l'esatta sintassi al momento mi sfugge.

Dark Phoenix
06-06-2007, 11:05
Si ripiegherò sul tipedef comunque se qualcuno dovesse trovare come si scrive metta in risalto

ehm.... lo metta in risalto qui :D

andbin
06-06-2007, 11:18
Ecco un esempio senza usare typedef:
#include <stdio.h>

void myfunc (int a)
{
printf ("%d\n", a);
}

void (*getFunc(void)) (int)
{
return myfunc;
}

int main (void)
{
void (*f)(int);

f = getFunc ();

f (123);

return 0;
}

Comunque è molto meglio usare typedef. ;)

Dark Phoenix
06-06-2007, 13:21
Si effettivamente risulta un po troppo criptico e quindi poco manutenibile

Seguirò il consiglio
grasssie :)

wingman87
06-06-2007, 13:29
Giusto per curiosità... a che serve fare una cosa del genere? Che applicazioni ha?

Dark Phoenix
06-06-2007, 13:34
Beh ho una applicazione che per struttura deve utilizzare il design pattern Command, che in C ho implementato rilasciando dinamicamente un puntatore ad una funzione :D

andbin
06-06-2007, 13:47
Giusto per curiosità... a che serve fare una cosa del genere? Che applicazioni ha?L'obiettivo dei puntatori a funzione è concettualmente abbastanza semplice: poter trattare una funzione come se fosse una variabile che può essere assegnata, passata, restituita, ecc....

Il concetto quindi è quello di avere un tipo di dato che possa rappresentare, per dirla in modo semplice, un "comportamento".

Nel mio esempio sopra, getFunc ritorna sempre lo stesso puntatore a funzione. Ora immagina che ci siano più funzioni (che fanno cose diverse/in modo diverso) con lo stesso prototipo e che getFunc determini quale di queste ritornare in base ad altre condizioni.
Questo il main() non lo sa, riceve solamente un puntatore a funzione ("un comportamento") che poi utilizza.

Se non è chiaro, posso spiegare con un esempio.