Purtroppo, svolgendo l'esercizio proposto da vbextreme, mi accorgo di non aver ancora padronanza sui puntatori a funzione.
Ok, l'esempio didattico, l'ho capito:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
void prova(int x)
{
x=x+100;
printf ("ciao mondo %d\n",x);
}
int main(void)
{
int a=19;
void (*ptr)(int)=prova;
(*ptr)(a);
return 0;
}
Fin qui, nessun problema. Ma già mi sorge un dubbio:
e perchè non
stiamo creando un puntatore che deve essere indirizzato alla funzione prova, quindi perchè l'operatore & non ci va?
Forse è come negli array e stringhe, che è scontato che puntino all'inizio, al primo elemento?
Qui è implicito che si punta "all'inizio" della funzione?
Detto questo, i problemi sono insorti nel passare ad una funzione un puntatore a funzione.
Io ho provato questo codice, scritto da me, ma non funziona e da un sacco di warning e errori:
Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
void prova_stampa ();
int foo(int a,int b,void **ptr_stampa);
void prova_stampa ()
{
printf ("ciao\n");
return ;
}
int foo(int a,int b,void **ptr)
{
*(ptr);
return a+b;
}
int main()
{
int ris;
int a=10;
int b=15;
void (*ptr_stampa)(void)=prova_stampa;
ris=foo (a,b,&ptr_stampa );
printf ("%d\n", ris);
return 0;
}
Qui, pensavo di passare il puntatore stampa, tramite & già citato prima:
Codice: Seleziona tutto
void (*ptr_stampa)(void)=prova_stampa;
ris=foo (a,b,&ptr_stampa );
e qui
Codice: Seleziona tutto
int foo(int a,int b,void **ptr)
{
*(ptr);
return a+b;
}
ho messo il doppio ** perchè dal main ho passato un puntatore, quindi nella funzione foo, vado a lavorare con puntatore a puntatore.
Qui col puntatore, pensavo di puntare alla funzione che stampa, ma evidentemente il discorso è sballato...perchè?
Passare puntatori a funzione, lo so fare, l'ho fatto con le liste, ma qui, dov'è la differenza?
Non capisco.
Guardando poi su un'altro manuale ho trovato questo modo:
Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
void print ()
{
printf ("ciao\n");
return;
}
int foo (int a,int b,void (*f)(void))
{
f();
return a+b;
}
int main()
{
int a=10;
int b=10;
int res;
res=foo (a,b,print);
printf ("%d\n",res);
return 0;
}
Che funziona.
La cosa triste, è che come ho pensato io, non va bene per nulla, e mi fa pensare che del c...non ho capito un c
Cosa sbaglio nel mio ragionamento?
In fondo passo un puntatore a funzione, come dicevo prima..ma non va!!
Avrò detto un sacco di sciocchezze, lo so, ma se qualcuno mi facesse chiarezza...maledetti manuali che si fermano all'esempio didattico!!!
