Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Un paio di righe di codice

    Sto studiando il codice di un echo server.
    Non sono ferratissimo in C, ma queste righe mi sembrano proprio incomprensibili

    1) tcp_accept(pcb, echo_accept);

    già qui... che significa passare una funzione come parametro?
    il prototipo è:

    void tcp_accept(struct tcp_pcb *pcb,
    err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
    err_t err))

    il primo parametro è una struttura e il secondo? è una funzione?
    E poi... i parametri come li passa? Nella riga 1) echo_accept nn ha parametri?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    E' il "puntatore ad una funzione".

    Tale funzione deve usare i seguenti parametri

    void *arg, struct tcp_pcb *newpcb, err_t err

    e restituire un valore

    err_t


    L'uso di puntatori a funzioni e' comune in C.

    Il concetto di funzione di callback e' uno degli utilizzi maggiori di tale costrutto ...

  3. #3
    Per quello che so i puntatori servono a fare i passaggi per riferimento. Se passo il puntatore di una variabile ad una funzione
    questa potrà modicficarne il valore. Ma nn riesco a capire che senzo abbia passare il puntatore ad una funzione.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Eccome se ha senso.

    Supponi che ci sia una funzione accetta in ingresso un array di dati e lo restituisce ordinato.

    Se la necessita' e' di ordinarle secondo criteri diversi, e' molto comodo indicare anche un "puntatore alla funzione" che si occupera' di valutare l'ordine di due singoli elementi dell'array in modo da rendere l'algoritmo implementato dalla prima funzione, generico e indipendente dai dati.

    Le funzioni di enumerazione, ad esempio, accettano un puntatore ad una funzione in cui viene gestito il singolo item enumerato.

    Il subclassing, e' un'altra situazione in cui i puntatori a funzione sono necessari.

  5. #5
    Quindi se nn ho capito male, l' utilità è quella di poter chiamare più funzioni che svolgono compiti diversi giusto? Nel mio caso è una Echo ma potrebbe essere una funzione che fa altro, tipo elaborare la stringa e poi rimandarla.

    Quello che nn mi spiego ancora è come vengono passati i parametri della funzione.Nella chiamata

    1) tcp_accept(pcb, echo_accept);

    mancano i parametri da dare alla echo_accept che ha un prototipo

    static err_t
    echo_accept(void *arg, struct tcp_pcb *pcb, err_t err)

    (e si capiva già dal prototipo della tcp_accept)

    da dove li prende?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    C'e' un equivoco di fondo ...

    Tu non devi passare dei parametri perche' non stai chiamando la funzione. Quello che passi e' l'indirizzo in memoria della funzione e il suo prototipo in modo che la funzione a cui viene passato tale indirizzo sappia come richiamare la funzione puntata.

    Se hai una funzione A e le passi il puntatore ad una funzione B, devi dire alla funzione A

    1) dove inizia in memoria la funzione B

    2) che parametri accetta la funzione B

    In questo modo, dall'interno della funzione A, la stessa funzione A potra' chiamare la B in maniera corretta, sapendo dov'e' e che parametri passare.

    I parametri, dunque, non li passi tu alla funzione A, ma la funzione A che chiama la B.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.