Re: Puntatori a Funzione[C]
e come no?però ugualmente non capisco perchè non posso passare il puntatore a funzione come si fa nelle liste e poi usare il doppio **
Ora te lo spiego alla mia maniera,che tecnicamente è errata ma praticamente fa capire molto:
Codice: Seleziona tutto
int* BETA;
void(*BETA)(void);
Codice: Seleziona tutto
void()(void)* BETA;
Il compilatore vuole la forma { RETURNTYPE( * NOMEVARIABILE)(PARAMETRI) }
Lo vedi l'asterisco? ecco è un puntatore e se fai & lo passi per indirizzo e quindi pttieni un puntatore a puntatore di funzione proprio come si fa con le variabili.
[EDIT]
Ora eccoti delle egualianze non per tipo di variabile creata ma per come si dichiarano:
Dichiarazioni equivalenti
Codice: Seleziona tutto
int BETA == void(BETA)(void) == void BETA(void) // variabile reale e quindi funzione reale
int* BETA == void(*BETA)(void) //puntatore
int** BETA == void(**BETA)(void) //puntatore puntatore
[/EDIT]
Ora se io voglio Un puntatore a puntatore come dovrei fare?
Codice: Seleziona tutto
int** BETA;Codice: Seleziona tutto
void(**BETA)(void);
Codice: Seleziona tutto
typedef void(*PFNC)(void);
void stampaA()
{
printf("a");
}
void stampaB()
{
printf("b");
}
void cambia(PFNC* f)
{
*f = stampaB;
}
void esteso( void(**f)(void) )
{
*f = stampaB;
}
int main()
{
PFNC z = stampaA;
cambia(&z);
z();
void(*festesa)(void) = stampaA;
esteso(&festesa);
festesa();
return 0;
}
Ora per risolvere l'esercizio devi solo modificare un pochino la tua proposta didattica.Non devi fare altro che mettere il primo parametro a void,il secondo in modo da accettare la qsort ed il terzo per accettare la compare.