Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C] Puntatori a funzioni

    Ciao a tutti,
    stavo cercando di capire come funzionano questi puntatori a funzioni ma non ho ancora trovato documenti che lo spieghino con esempi facili. Supponiamo che io ho un array e che voglio applicare ad ogni elemento di questo una funzione( ad esempio che somma all'elemento semplicemente 1 ), come la realizzio? Io ho scritto una cosa cosi':

    codice:
    #include <stdio.h>
    
    #define N 5
    
    int f( int* a )
    {
        int i;
        for( i = 0; i < N; i++ )
             a[i]++;
    }
    
    void applica( int *array, int (*f)( int* ) )
    {
         f( array );
    }
    
    int main( int argc, char **argv )
    {
        int array[5];
    
        int i;
        for( i = 0; i < N; i++ )
             array[i] = i;
    
    
        for( i = 0; i < N; i++ )
             fprintf( stdout, " %d ", array[i] );
    
        applica( array, f( array ) );
    
        char t;
        fscanf( stdin, "%c", &t );
    }
    ovviamente non funziona , e manco compila
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Gia' che ci sono vi pongo anche il secondo quesito. Devo fare un esercizio dove c'e' un albero binario ordinato e il testo dell'esercizio dice:

    "Scrivere una funzione map_albero che applica la funzione f( di tipo int (*f)(int) ) a tutti gli interi sull'albero sostituendo ogni intero x con f(x)"

    praticamente questa funzione potrebbe essere una cosa tipo:

    codice:
    void map_albero( nodo *radice, int (*f)(int) );
    ?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Due errori

    codice:
    #include <stdio.h>
    
    #define N 5
    
    int f( int* a )
    {
      int i;
      for( i = 0; i < N; i++ )
          a[i]++;
    
      return(0);
    }
    
    void applica( int *array, int (*f)( int* ) )
    {
       f( array );
    }
    
    int main( int argc, char **argv )
    {
        int array[5];
    
        int i;
        for( i = 0; i < N; i++ )
             array[i] = i;
    
    
        for( i = 0; i < N; i++ )
             fprintf( stdout, " %d ", array[i] );
    
        applica( array, f  );
    
        char t;
        fscanf( stdin, "%c", &t );
    }

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Se è possibile, vorrei capire l'utilità dei puntatori a funzione...
    Se ho capito bene contengono l'indirizzo di memoria di una funzione, ma come si usano? A quale scopo?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da XWolverineX

    Se ho capito bene contengono l'indirizzo di memoria di una funzione, ma come si usano? A quale scopo?
    Tip interessante sull'argomento:
    http://edu.os3.it/html/manual/impararec/node63.html

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  6. #6
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    capito l'errore. Grazie :-) Per quanto riguarda la seconda domanda che ho fatto, e' giusta la dichiarazione di funzione che ho scritto?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Poker1
    capito l'errore. Grazie :-) Per quanto riguarda la seconda domanda che ho fatto, e' giusta la dichiarazione di funzione che ho scritto?
    Potrebbe ...

  8. #8
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    come potrebbe dato l'esercizio tu la faresti cosi' ?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  9. #9
    Originariamente inviato da Poker1
    Gia' che ci sono vi pongo anche il secondo quesito. Devo fare un esercizio dove c'e' un albero binario ordinato e il testo dell'esercizio dice:

    "Scrivere una funzione map_albero che applica la funzione f( di tipo int (*f)(int) ) a tutti gli interi sull'albero sostituendo ogni intero x con f(x)"

    praticamente questa funzione potrebbe essere una cosa tipo:

    codice:
    void map_albero( nodo *radice, int (*f)(int) );
    ?
    Nel prototipo per quanto riguarda la funzione devi scrivere solo il nome della funzione senza parametri.
    Dovrai poi definirti una funzione che rispetti i vincoli dati: cioe' che torni un int e prenda come parametro un int.

    Cmq nodo sara' una struttura e quindi nel prototipo di funzione si scrive
    codice:
    struct nodo*radice
    .

    oh gervasi!

  10. #10
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    il il prototipo l'ho fatto cosi':

    void map_albero( Nodo *radice, int (*f)( int * ) );

    e ho ho la struttura nodo col typedef:

    typedef struct nodo Nodo;

    Ho passato al puntatore a funzione int* altrimenti non mi midificava il dato..

    oh gervasi!
    studi a pisa?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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 © 2024 vBulletin Solutions, Inc. All rights reserved.