Newsgroup: it.comp.lang.c
Titolo: puntatori a funzioni....

Salve,
ho delle incertezze riguardanti i puntatori a funzione,
Date un occhio al seguente codice:
char *gpe_socket_read (int socket)
{
  char tmp_buf[200];
  int nbytes;
  nbytes = read (socket, tmp_buf, 200); /* non ANSI C */
 
 
  return (tmp_buf);	
}
Ora pensate a read (che non e' ANSI C come fgets)
legge un determinato numero di bytes da un FILE descriptor
che in questo caso e' un socket, ma per non essere OT
fate conto che sia un normale FILE.
ora la funzione legge determinati caratteri e li registra
in tmp_buf, ritornandoli poi alla funzione chiamante.
Per ottenere quanto letto e' corretto fare:
char *testo;
test = gpe_socket_read(socket); 
?
Grazie.
-- 
+ 
g.gab...@europe.com
 ---------------+
|                                      |
+------------------ think Open Source -+

 ?
si', mi sembra corretto .... ma che c'entrano i puntatori a funzioni ???
questa e' una semplice funzione che restituisce un puntatore ....
un puntatore a funzione e' qualcosa del tipo 
char (*p_funzione)(int x, int y); /* mettere le parentesi !!*/
cioe' un puntatore che puo' essere assegnato ad una qualsiasi funzione
che
restituisca lo stesso tipo di dato e che abbia lo stesso tipo di
parametri ..
es:
int p_int;
int int1, int2;
int fz_uno (int a, int b);
int fz_due (int z, int k);
if (condizione ...)
	{
	p_funzione = fz_uno;
	}
else
	{
	p_funzione = fz_due;
	}
p_int = p_funzione (int1, int2);
ciao ciao ....	
-- 
Antonio barbone ......
Outside of a dog, a book is man's best friend.
Inside of a dog, it's too dark to read.
		-- Groucho Marx

 in tmp_buf, ritornandoli poi alla funzione chiamante.
No.  tmp_buf e` di storage-class auto, e quindi viene
distrutta/riusata/riciclata non appena termina il blocco
che la contiene.  Quindi, il puntatore che questa
funzione ritorna e` spazzatura (se funziona e` un caso).
Questo, incidentalmente, non ha nulla a che vedere
con i puntatori a funzione.
Alex


Infatti la funzione mi ritorna "spazzatura"....
non sempre, a volte funziona, ma ovviamente sono casi ;-)
Sapresti farmi un esempio per farla funzionare correttamente ?
Visto che che non riesco proprio a capire come far ritornare 
la stringa letta dalla funzione ...
 
Grazie comuqnue,
Gabriele


 la stringa letta dalla funzione ...
Dichiara
    static char tmp_buf[200];
e comincera` a funzionare (il chiamante deve copiarsi la stringa
da qualche parte prima di chiamare di nuovo la funzione...!).
Alex

...

Oppure
    char* tmp_buf;
    tmp_buf=(char*)calloc(200,sizeof(char));
Giacomo

     tmp_buf=(char*)calloc(200,sizeof(char));
In questo caso, il chiamante dovra` applicare un free al
risultato ritornato, altrimenti, dopo un certo numero di
queste chiamate, il programma si blocchera` (e, prima di
arrivare a quel punto, puo` aver messo del tutto "in
ginocchio" la macchina se essa usa memoria virtuale).
Alex

...

A questo punto sarebbe meglio cambiare il prototipo della funzione
in modo tale che il buffer dei dati sia passato tra i parametri, con la sua
dimensione, così da essere allocato e deallocato da chi chiama la funzione
cioè
        void leggi(char* buffer, int len_buff);
con buffer già allocato prima della chiamata.
Giacomo