Newsgroup: it.comp.lang.c
Titolo: Puntatori di funzioni?!?

Slave volevo chiedervi una cosa. Ho trovato il seguente prototipo di una
funzione in un sorgente:
/* place to put the old connect() call */
static int (*old_connect) (int sockfd, const struct sockaddr *serv_addr,
int addrlen);
che significa quel (*old_connect)?!?!?
piu' avanti nel sorgente c'e':
  return old_connect (sock, (struct sockaddr *)&sa, sizeof sa);
queste sono le varie librerie incluse
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
-- 
Posted from 
nem...@t3-d-static-237.adsl.directlink.net
 [63.68.131.237] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

che significa quel (*old_connect)?!?!?
Puntatore a funzione.

che significa quel (*old_connect)?!?!?
Questo e' un semplice esempio di uso di puntatori a funzione:
/*******************************/
  #include <stdio.h>
  int pippo1(int x,int y)
  {
    printf("Pippo1(%i,%i)\n",x,y);
    return x+y;
  }
  int pippo2(int x,int y)
  {
    printf("Pippo2(%i,%i)\n",x,y);
    return x*y;
  }
  int main()
  {
    int (*p)(int,int); /* Puntatore a funzione */
    int res;
    p=pippo1; /* Ora punta a pippo1() */
 
    res=p(2,3);
    printf("Res = %i\n",res);
    p=pippo2; /* Ora punta a pippo2() */
    res=p(2,3);
    printf("Res = %i\n",res);
    return 0;
  }
/*******************************/
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Sucsami andrea, volevo chiederti una cosa. Se ho capito bene i puntatori
di funzione sono un po' come l'overloading di funzioni in java e c++ vero?

Grazie.


On Fri, 22 Jun 2001 22:10:52 +0000 (UTC), 
nem...@sdf.lonestar.org
(marco carrano) wrote:
Non quotare tutto il messaggio (usa un puntatore al post! B->)
ciao, acc.   
a...@libero.it

di funzione sono un po' come l'overloading di funzioni in java e c++ vero?
Non ne capisco il nesso, onestamente.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

di funzione sono un po' come l'overloading di funzioni in java e c++ vero?
Non vedo il nesso. L'overloading e' la possibilita' di definire
funzioni con lo stesso nome ma parametri diversi... un puntatore
a funzione e' qualcosa di completamente diverso: puoi accedere
a una fra N funzioni purche' abbiano tutte gli stessi parametri
e lo fai passando un puntatore alla funzione che ti interessa.
Un caso classico sono le callback ... ad esempio
  typedef struct NODO
  {
    int valore;
    struct NODO *prev,*next; /* Link di lista */
  } Nodo;
  /*
  ** Questa procedura chiama la funzione passata in f
  ** per ogni nodo della lista passata in l
  */
  void list_forall(Nodo *l,void (*f)(Nodo *))
  {
    while(l)
    {
      f(l);      /* Chiama la funzione richiesta */
      l=l->next; /* Passa al prossimo elemento */
    }
  }
  /*
  ** Questa funzione raddoppia il valore di un elemento
  */
  void Radddoppia(Nodo *n)
  {
    n->valore *= 2;
  }
  /*
  ** Questa funzione stampa un elemento
  */
  void Stampa(Nodo *n)
  {
    printf("valore = %i\n",n->valore);
  }
  ...
  {  
    list_forall(l,Raddoppia); /* Raddoppia gli elementi della lista */
    list_forall(l,Stampa);    /* Stampa la lista */
