PDA

View Full Version : [C++] Puntatori a funzioni differenti


Unrue
04-12-2008, 13:28
Ciao ragazzi,
è possibile usare un puntatore a funzione con funzioni che prendono un numero diverso di argomenti?

Ad esempio:

funzione1(int)
funzione2(double,int)

cionci
04-12-2008, 17:37
Non che io sappia

sottovento
04-12-2008, 20:04
Perche' no? Si puo' sempre fare il cast di un puntatore da un tipo all'altro.
Il problema magari e' poi sapere se questo ha un senso... :D


typedef int (*ptrToFunc1Param)(int);
typedef int (*ptrToFunc2Param)(double, int);

ptrToFunc1Param p1;
ptrToFunc2Param p2;

p1 = (ptrToFunc1Param)p2;



e poi? Beh, sapendo com'e' organizzato lo stack per default (i.e. push e pop dei parametri attuali dal chiamante, push dei parametri in ordine inverso) potresti provare qualche giochetto "sporco". Poi pero' non piangere se va tutto in crash o se la portabilita' e' un'altra cosa ;)

Unrue
04-12-2008, 20:15
Mm,meglio di no allora, troppo rischioso.

Ma se ad esempio definisco una funzione che prende un numero indefinito di parametri (ellissi) e poi un puntatore che punta ad essa?

E' fattibile?

sottovento
04-12-2008, 20:49
Beh, si. Ma mi sembra che il problema sia un altro e dipenda dal software che stai realizzando: in fase di chiamata della funzione, hai un semplice puntatore.
Hai un meccanismo per sapere quali e quanti parametri passare?

Immagino che per realizzare una soluzione del genere ti stia interfacciando a software gia' esistente (magari in C), ...

Scusa la banalita', ma nel caso tu stia invece progettando un software nuovo (in C++), prima di affrontare una simile soluzione prova a verificare se un semplice polimorfismo puo' fare al caso tuo. Anche se immagino ci avrai gia' pensato.

Unrue
04-12-2008, 21:18
Beh, si. Ma mi sembra che il problema sia un altro e dipenda dal software che stai realizzando: in fase di chiamata della funzione, hai un semplice puntatore.
Hai un meccanismo per sapere quali e quanti parametri passare?

Immagino che per realizzare una soluzione del genere ti stia interfacciando a software gia' esistente (magari in C), ...

Scusa la banalita', ma nel caso tu stia invece progettando un software nuovo (in C++), prima di affrontare una simile soluzione prova a verificare se un semplice polimorfismo puo' fare al caso tuo. Anche se immagino ci avrai gia' pensato.

Si esatto, sto richiamando codice C già esistente. Il numero di parametri posso sapere quanti e quali sono, per ogni funzione. Quindi si può fare?

sottovento
05-12-2008, 07:31
Direi di si. Inoltre, visto che hai un meccanismo per sapere il numero di parametri (il loro tipo, anche?) allora puoi usare anche la soluzione precedente, qualcosa del genere:


void *p; // il tuo generico puntatore a funzione
int res;
...
switch (NumberOfParameters)
{
case 1:
{
ptrToFunc1Param p1 = (ptrToFunc1Param)p;
res = p1 (firstParameter);
}
break;
case 2:
{
ptrToFunc1Param p2 = (ptrToFunc2Param)p;
res = p2 (firstParameter, secondParameters);
}
break;
}



e cosi' via. Immagino che saprai far sicuramente meglio di questo codice.
Cmq direi che entrambe le soluzioni (questa o funzione con lista variabile di parametri) sono attuabili in quanto hai confermato che SAI quali e quanti argomenti passare....

cionci
05-12-2008, 10:53
sottovento: intendi accompagnare p con numero e tipo di parametri ? Allora direi tanto vale accompagnarla con una costante che identifica il tipo della funzione...

Qualcosa del tipo:

#define FUNCTION1 1
#define FUNCTION2 2

struct functionData
{
void *pointer;
int type;
};

Poi con uno switch su type si fa il cast come hai messo nel codice sopra.
Funziona, ma a me sembra un ragionamento alquanto contorto, cosa mi impedisce di chiamare direttamente la funzione senza il puntatore ? Ovviamente a meno che ci siano diverse funzioni con gli stessi parametri interscambiabili nel puntatore.

sottovento
05-12-2008, 11:25
Si. Cercavo di fare un discorso che fosse il piu' generico possibile... cmq da quel che ho capito Unrue ha gia' la soluzione, quale che sia, per esso.

A proposito della tua domanda: non conosciamo il problema.
La risposta che poi hai dato ha perfettamente senso e, per quel poco che ho imparato lavorando sul codice altrui, corrisponde al 90% dei casi ;)

Unrue
08-12-2008, 09:54
Ok, grazie a tutti delle risposte :)