|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6521
|
[C++] Puntatori a funzioni differenti
Ciao ragazzi,
è possibile usare un puntatore a funzione con funzioni che prendono un numero diverso di argomenti? Ad esempio: Codice:
funzione1(int) funzione2(double,int) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non che io sappia
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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... Codice:
typedef int (*ptrToFunc1Param)(int); typedef int (*ptrToFunc2Param)(double, int); ptrToFunc1Param p1; ptrToFunc2Param p2; p1 = (ptrToFunc1Param)p2;
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6521
|
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? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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.
__________________
In God we trust; all others bring data |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6521
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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:
Codice:
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;
}
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....
__________________
In God we trust; all others bring data |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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
__________________
In God we trust; all others bring data |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6521
|
Ok, grazie a tutti delle risposte
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:00.



















