Pages: [1]   Go Down
Author Topic: Problema con puntatore a funzione  (Read 682 times)
0 Members and 1 Guest are viewing this topic.
MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti.

Ho un problema con il passaggio di un puntatore ad una funzione come parametro.
Ho una classe dove un metodo accetta come parametro un puntatore ad una funzione di un certo tipo, esattamente ritornante void con un solo parametro di tipo uinti8_t

Code:

void Classe1::FunzioneA(void (*puntatore)(uint8_t))
{
// codice qui...
}



Ora, se passo alla classe il parametro liscio come indicato nell'esempio sotto, non ho alcun problema

Code:

void foo(uint8_t parametro)
{
// codice qui...
}

miaClasse = Classe1();

miaClasse.FunzioneA(foo);


Se invece tento di passare come paramentro alla stessa classe un puntatore ad una funzione contenuta in un altra classe di cui pongo un esempio sotto , mi genera un errore in fase di compilazione:

Code:

Classe2::foo(uint8_t parametro)
{
// codice qui...
}

Classe2::FunzioneB()
{

miaClasse1.FunzioneA(foo);
//errore 'Classe1::FunzioneA(<unresolved overloaded function type>)'

}


Ho fatto varie prove, ma non mi piace andare a tastoni, vorrei capire cosa non và.
Sò che può sembrare contorta la mia spiegazione, e mi rendo conto che probabilmente solo io che sto 'sul pezzo' posso capire cosa ho scritto, ma è la forma che mi sembrava più chiara da spiegare.
In tutti i casi posso fornire spiegazioni mirate.
Grazie a  tutti in anticipo.

Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quando definisci una classe questa non occupa spazio in memoria, per questo non ha senso passare un puntatore a medoto di classe, mentre è possibile passare un puntatore a metodo di oggetto. Quindi prima crei istanza di classe e poi passi il puntatore con object.function, dove object è l'instanza.

Ciao.

Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Mauro, il punto è che il problema è lo stesso, avevo già provato:

Code:

miaClasse1 = Classe1();
miaClasse2 = Classe2();
miaClasse1.FunzioneA(miaClasse2.foo);


 smiley-sad-blue

Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, il fatto è che il puntatore dichiarato è semplice, invece ne va dichiarato uno specifico per quella classe, ora non ricodo come ho fatto. Provato a cercare su google?

Leggi qua : http://www.ugidotnet.org/Forum/ViewThread/5439
Ringraziamo San google. smiley-grin
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così. Metti nell'header questo:
class miaClasse1 {
  public:
      miaClasse1();
      tipo_dato funzioneA(void (*)(void), uint8_t parametro);
}

e poi nel file .cpp questo:

tipo_dato miaClasse1::funzioneA(void (*foo)(void), uint8_t parametro) {
  ....
}

Devi cioè aggiungere il tipo di parametro, cioè un (void), subito dopo il puntatore racchiuso fra parentesi.
Logged


MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Devi cioè aggiungere il tipo di parametro, cioè un (void), subito dopo il puntatore racchiuso fra parentesi.


Il punto è che il parametro non è void, ma uint8_t

Code:
class classe1
{

public:
classe1();
virtual ~classe1();
void funzioneA(void (*)(uint8_t));
}
« Last Edit: December 28, 2012, 11:05:27 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22640
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi riferivo a quando passi come parametro il puntatore alla funzione, forse ho fatto casino con i nomi che hai usato tu.
Logged


Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sintetizzando brutalmente: puntatore a funzione != puntatore a metodo di oggetto.

Risposta più articolata:

http://stackoverflow.com/questions/151418/calling-a-c-function-pointer-on-a-specific-object-instance
Logged

Pages: [1]   Go Up
Jump to: