|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
C: tipo di ritorno, funzione
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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Si ripiegherò sul tipedef comunque se qualcuno dovesse trovare come si scrive metta in risalto
ehm.... lo metta in risalto qui ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco un esempio senza usare typedef:
Codice:
#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; } ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Si effettivamente risulta un po troppo criptico e quindi poco manutenibile
Seguirò il consiglio grasssie ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Giusto per curiosità... a che serve fare una cosa del genere? Che applicazioni ha?
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
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
![]() |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:54.