|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
callback in c++...si puo?
gestione della porta seriale:
l'ho implementata in c tramite la sigaction SIGIO. cioe' quando arriva qualche byte nel mio descrittore "fd" mi viene chiamata una callback. che puo' leggere i byte in questione. stavo cercando di portare in c++ questo modello. in c la callback che mi gestisce la seriale si chiama void signal_handler_io(int status); quando riempio la struttura sigaction per indicare questa callback faccio: saio.sa_handler= signal_handler_io; ora la mia funzione membro in cpp e' Myir::signal_handler_io(int status); e se faccio saio.sa_handler= Myir::signal_handler_io; mi da un errore: |
![]() |
![]() |
![]() |
#2 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: callback in c++...si puo?
Quote:
Codice:
Myir x(...); /* blah */ saio.sa_handler = & x.signal_handler_io |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Re: callback in c++...si puo?
Quote:
ad as dichiari 'a' puntatore un oggetto della classe, poi istanzi l'oggetto con una new e infine chiamerai la funzione: saio.sa_handler=a->signal_handler_io(...); tra l'altro nel tuo esempio hai dichiarato la funzione in modo che debba accettare un parametro ma tu non le passi niente |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
rispondendo a /\/\@®¢Ø non voglio creare un oggetto e dalla main assegnarci una funzione
ma gia' da dentro la classe voglio che la stessa classe di default abbia una propia funzione di callback che poi e' il cuore della classe, altrimenti il modello ad oggetti va in c@@o. ![]() Quote:
qual'e' l'indirizzo della funzione di callback da chiamare io voglio una classe autonoma che punti da se ad una funzione sua di callback senza che debba essere specificata dopo la sua creazione ma che sia implicita. forse this potrebbe aiutarmi? |
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Tale metodo allora deve essere 'marchiato' static. Qualcosa del genere insomma: Codice:
class Myir { /* ... */ static void Myir::signal_handler_io(int status); /* ... */ }; /*...*/ saio.sa_handler= & Myir::signal_handler_io; |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
ah quindi tu vuoi passare a saio.sa_handler l'indirizzo della funzione definita dentro la classe. allora la funzione nella classe deve essere static e saio.sa_handler deve essere un puntatore a funzione con la stessa intestazione.
ovviamente la funzione static non può accedere che ad elementi static della classe cioè non può per ovvie ragioni accedere ai dati di ciascun oggetto che istanzierai di quella classe. può accedere solo alle var static della classe poichè anche di quelle c'è una sola per classe. this non lo puoi proprio usare perchè le funzioni static non sono riferite ad alcun oggetto. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
sono arrivato in ritardo di un minuto
![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
ho capito ma non molto bene.
il mio obiettivo e': creare una classe che mi gestisca una porta infrarossi che altro non e' che una porta seriale. voglio poter creare un oggetto, assegnargli una porta seriale e leggere e trasmettere dati da questo oggetto. il modo in cui i dati arrivano all'oggetto e' tramite una funzione di callback che io vorrei ridefinire per ogni oggetto al momento dell'inizializzazione dello stesso, e non avere una sola callback per tutta la classe. con static la funzione e' "di classe" a me serve l'indirizzo della funzione di callback appartenente "all'oggetto istanziato" a runtime per poterlo inserire nella var saio.sa_handler. e' complesso ma in altro modo come si puo' fare? |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
non riesco a capire cosa non capisci ![]() ![]() allora se hai una funzione di callback che deve accedere ai singoli dati dell'oggetto la sarà una normalissima funzione membro e DOPO aver istanziato l'oggetto passerai l'indirizzo della funzione come ti avevamo detto prima a saio.sa_handler. non capisco perchè allora non ti andava bene la prima soluzione. o al costruttore passi come parametro il puntatore di saio.sa_handler e nel costruttore gli assegni l'indirizzo della tua callback o fai una funzione aggiuntiva nella classe nella quale farai la stessa cosa. tra l'altro ricordati di metterla public questa funzone. scusa se te lo chiedo - per capire quale può essere il dubbio - tu programmi in C++ da molto? |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
leggere un libro non basta...
programmo da 5/6 minuti |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
io ho un file che e' Myir.h
Codice:
class Myir:public QObject{ Q_OBJECT public: Myir(QObject *parent=0,const char * name=0); void signal_handler_IO(int signum); int com_open; private: int apriporta(char *device); void datidallaseriale(int messaggio,int valore); int fd_com; } Codice:
Myir::Myir(QObject *parent, const char *name):QObject(parent,name){ //apri file di configurazione e leggi il device al quale collegare questo oggetto apriporta(device); } void Myir::signal_handler_IO(int signum){ //gestione dei bytes presenti nella seriale. } Myir::apriporta(char *device){ struct sigaction saio; saio.sa_handler=****************************************cosa ci metto qui? sigaction(SIGIO,&saio,NULL); } ![]() se in saio.sa_handler=************************ ci metto&Myir::signal_handler_io l'errore e': Myir.cpp:312 converting from 'void(Myir::*)(int)' to 'void (*)(int)' Ultima modifica di x110 : 24-07-2004 alle 14:45. |
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
Quote:
mentre cio' che mi dite e' Myir x(...); /* blah */ saio.sa_handler = & x.signal_handler_io Quote:
![]() |
||
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
aaaahh cavolo ma all'inizio non era chiaro che l'assegnamento lo facessi dentro una funzione della classe!! al posto degli asterischi: ci metti semplicemente signal_handler_io e basta. al più metti davanti & ma non è necessario. l'errore infatti che ti dà è su Myir:: perchè sei già nello stesso scope. se metti Myir:: cerca in uno scope annidato che non c'è ![]() fammi sapere se è tutto ok dopo! Ultima modifica di Black imp : 24-07-2004 alle 15:20. |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
all'inizio pensavo cosi' anch'io, ma:
senza & mi da: no matches converting function 'signal_handler_io' to type 'void (*) (int)' candidates are void Myir::signal_handler_io(int) con & taking the address of a non-static member function to form a pointer to member function, say '&Myir::signal_handler_IO' converting from 'void (Myir::*)(int)' to 'void (*)(int)' |
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
|
Quote:
|
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
quindi non si può assegnare a un puntatore a funzione esterno alla classe una funzione membro non statica della classe? e con un cast? |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
quindi dici che non esiste soluzione?
se cosi' fosse e' un po un sistema del c...... non si puo' fare un cast? ![]() ![]() this potrebbe essere utile? sorpassato per un microsecondo ![]() Ultima modifica di x110 : 24-07-2004 alle 15:47. |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
|
Quote:
scrivere this.funzionemembro o funzionemembro è lo stesso ![]() ma scusa non ho capito però il senso: saio.sa_handler non gestisce mica una sola porta? se è così perchè fare una classe istanziabile da più oggetti ciascuno con la sua funzione di callback? scusa è un po' che non uso il c++ e sto cercando di capirti |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
Quote:
sinceramente non conosco al 100% i segnali, ora studio meglio cio' che ho scopiazzato per ricevere il segnale. |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
comunque il senso e':
poter aprire piu' porte infrarossi a cui fanno capo piu' oggetti istanziati della stessa classe con piu' funzioni di callback appartenenti a ciascun oggetto |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:05.