Newsgroup: it.comp.lang.c
Titolo: Puntatori a funzione e puntatori void

Salve a tutti, sto leggendo il K&R a pagina 152, sui
puntatori a funzioni e puntatori void.
Quello che non ho capito e questo:
dichiaro il prototipo di un puntatore
a funzione: int (*miafunz) (int , int);
questa funzione la posso usare come una
funzione normale? quando passo questa funzione
ad un altra funzione, nel prototipo di quest'ultima
devo indicare il nome della puntatore a funzione
o posso usare :*p ?
posso anche indicare i due puntatori int o devo
mettere void.
Grazie a tutti
Ciao

 o posso usare :*p ?
basta indicare solo il nome della funzione, poiche vi e' il prototipo dopo 
le righe dell' #include 

[...]
ti ringrazio ma ho capito poco. :-)
Ciao

 mettere void.
Passi solo il puntatore.

[...]
... la cosa mi e ancora oscura . :-)
Ciao

[...]
allora , se dichiaro un puntatore
a funzione int (*miafubz) (int, int);
posso passare solo il puntaore ad un altra
funzione, il cui prototipo deve essere:
int o void funz2( *p, int,int /*per passare gli altri due arogomenti*/);
non posso fare:
int funz2( ( (*p)(int,int) ) );
sul K&R c'è scritto: int funz2(int (*comp) (void* , void*), int , int);
la funz2 ha come argomenti un puntatore a funz che si chiama comp
con due puntatori void* , che fanno parte di comp, e altri 2 argomenti
int che verranno utilizzati da comp.Giusto?
Ciao


io farei come nell'esempio qui sotto:
#include <stdio.h>
int f (int x, int y) {
    printf("f(%d,%d)\n",x,y);
    return 0;
}
int g( int (*p)(int,int), int x, int y){
    p(x,y);
    printf("g(%d,%d)\n",x,y);
    return 0;
}
int main(void) {
    g(f,1,2);
    return 0;
}
ciao.

 a quanto ne so io non esistono i puntatori a funzione
arrrgh!!!

 o posso usare :*p ?
No. Devi indicare il prototipo.
Essempio:
#include <stdio.h>
/* funzioni */
int add(int a, int b) { return a+b; }
int mul(int a, int b) { return a*b; }
/* superfunzione */
int f(int a, int b, int(*subf)(int,int)) { return subf(a,b); }
int main()
{
  int i;
  /* puntatore */
  int (*miafunz)(int,int);
  /* array di puntatori */
  int (*amiafunz[2])(int,int) = {add,mul};
   /* senza puntatore */
   printf("%d\n", f(1,2,add));
   printf("%d\n", f(1,2,mul));
   /* con puntatore */
   miafunz = add;
   printf("%d\n", miafunz(1,2));
   printf("%d\n", f(1,2,miafunz));
   miafunz = mul;
   printf("%d\n", miafunz(1,2));
   printf("%d\n", f(1,2,miafunz));
   for (i=0;i<2;i++)
     printf("%d\n", amiafunz[i](1,2));
 
   return 0;
}
-- 
Horst

 ciao.

 Ciao

 int che verranno utilizzati da comp.Giusto?
No. Gli argomenti int non verranno utilizzati da comp. Sono argumenti
per funz2. La funzione funz2 decide con quali parametri la funzione
passata viene chiamata. Essempio:
int sqr(int a) { return a*a; }
void funz1( int (*f)(int), int n)
/* chiamata con n */
{
      printf("%d\n", f(n));
}
void funz2( int (*f)(int), int n)
/* chiamata con diversi parametri */
{
      int i;
      for (i=1;i<=n,i++)
        printf("%d %d\n", i, f(i));
}
int main()
{
      funz1(sqr,7);
      funz2(sqr,7);
}
-----------------
49
1 1
2 4
3 9
4 16
5 25
6 36
7 49
-- 
Horst

 wrote:

La parte "int (*p) (int,int)" nel prototipo
   void funz2 ( int (*p) (int,int) , double, int , double )
è la dichiarazione di un solo parametro - del parametro "puntatore a
funzione". (int,int) non sono parametri de la funzione funz2 ma parte
del prototipo de la funzione passata.
-- 
Horst

 wrote:

perchè non c'è virgola nella dichiarazione de un puntatore a funzione.
La dichiarazione de un puntatore a una funzione con due parametri int
che ritorna un int è
	int (*p) (int int)
senza virgola, Allora il prototipo di un funzione con 3 parametri
1: puntatore a una funzione con due parametri int che ritorna un int
2: int 
3: double
che ritorna int è
	int funz ( int (*p) (int int) , int i, double d)
ovvero
	int funz ( int (*) (int int) , int, double)
-- 
Horst

[...]
... questa non l'ho capita. :-)
Ciao