I puntatori a funzioni

di il
14 risposte

I puntatori a funzioni

Salve per curiosità stavo provando a studiare i puntatori da autodidatta e ho scoperto i "puntatori a funzioni".
In merito a ciò ho capito che ogni funzione ha un indirizzo di memoria, come tutte le righe di codice di un programma, e che quando ci riferiamo a una funzione in realtà ci riferiamo alla prima riga di codice che la costituisce ovvero il punto in cui inizia.
Questo è quello che ho capito a livello teorico.
Ho provato a fare un mini programma ma che non funziona, o meglio non mi da i valori corretti:
il programma deve ricevere in input un carattere e dare come risultato il rispettivo valore in codice ASCII.

#include <stdio.h>
#include <stdlib.h>

int *conversione(char x);

int main()
{
    char carattere;
    int risultato=0;
    printf("CONVERSIONE CARATTERE-CODICE ASCII!\n");
    printf("\n");
    printf("Digitare una carattere: ");
    scanf("%c", &carattere);

     risultato = conversione(carattere);

    printf("CONVERSIONE: \n");
    printf("Carattere: %c \n",carattere);
    printf("Valore ASCII: %d \n", risultato);
    return 0;
}

int *conversione(char x)
{
    return 'x'- 0x30;
}
Spero che qualcuno mi possa aiutare. Grazie

14 Risposte

  • Re: I puntatori a funzioni

    Il tuo esempio e' sbagliato, per un sacco di motivi:

    int *conversione(char x);

    non hai dichiarato un puntatore a funzione, ma una funzione che ha un parametro di tipo char e ritorna un puntatore ad un intero.

    Per avere il valore ASCII di un char basta convertirlo in int senza nessuna altra strana operazione.

    Comunque, un esempio decisamente migliore e' questo:
    
    #include <stdio.h>
    
    float add(float x, float y) { return x+y; }
    float mul(float x, float y) { return x*y; }
    float sq2(float x, float y) { return x*x + 2*x*y + y*y; }
    
    
    void printfun(const char* op, float (*fun)(float, float), float x, float y)
    {
        printf("%f %s %f -> %f\n", x, op, y, (*fun)(x,y));
    }
    
    int main()
    {
        printfun("add", add, 2, 3);
        printfun("mul", mul, 2, 3);
        printfun("sq2", sq2, 2, 3);
    
        return 0;
    }
    

    Nota la posizione delle parentesi!!!!!
  • Re: I puntatori a funzioni

    Allora osservando il tuo esempio non riesco proprio a capire questo pezzo di codice
    void printfun(const char* op, float (*fun)(float, float), float x, float y)
    {
        printf("%f %s %f -> %f\n", x, op, y, (*fun)(x,y));
    }
  • Re: I puntatori a funzioni

    L'esempio di migliorabile è completo per spiegare i puntatori a funzione. Proviamo a vederlo passo passo così da chiarire ogni dettaglio.
    #include <stdio.h>

    float add(float x, float y) { return x+y; }
    float mul(float x, float y) { return x*y; }
    float sq2(float x, float y) { return x*x + 2*x*y + y*y; }


    void printfun(const char* op, float (*fun)(float, float), float x, float y)
    {
    printf("%f %s %f -> %f\n", x, op, y, (*fun)(x,y));
    }

    int main()
    {
    printfun("add", add, 2, 3);
    printfun("mul", mul, 2, 3);
    printfun("sq2", sq2, 2, 3);

    return 0;
    }
    Queste sono dichiarazioni a funzioni come avrai compreso.
    
    float add(float x, float y) { return x+y; }
    float mul(float x, float y) { return x*y; }
    float sq2(float x, float y) { return x*x + 2*x*y + y*y; }
    
    Questa è una dichiarazione a una funzione che ha tra i parametri un puntatore a funzione.
    Vale a dire che come secondo argomento la funzione printfun si aspetta il puntatore a una funzione che chiama fun, la quale funzione fun ha due dati di tipo float e ritorna un dato float.
    void printfun(const char* op, float (*fun)(float, float), float x, float y)
    {
        printf("%f %s %f -> %f\n", x, op, y, (*fun)(x,y));
    }
    Cerca di comprendere dl differenza con questa dichiarazione di funzione:
    
    void funzioneProva(const char* op, int (*funzione)(int, char), int x, char y);
    
  • Re: I puntatori a funzioni

    Nel secondo caso il puntatore a funzione di tipo intero a cui arrivano due valori cioè numero intero e carattere.
    Restituisce un valore numerico intero
  • Re: I puntatori a funzioni

    coppolino ha scritto:


    Nel secondo caso il puntatore a funzione di tipo intero a cui arrivano due valori cioè numero intero e carattere.
    Restituisce un valore numerico intero
    Nel secondo caso si tratta di un puntatore a funzione che riceve due valori: un intero e un carattere e, restituisce un intero.

    Esatto!
    Penso adesso abbia capito.
  • Re: I puntatori a funzioni

    Non ho capito ma il puntatore a funzione non posso dichiaralo come una funzione normale senza metterlo dentro un'altra?
  • Re: I puntatori a funzioni

    Puoi dichiarare un puntatore a funzione così:

    char (*FUN) (int, float);

    Ma a che serve?

    Magari è utile dichiarare:

    typedef char (*FUN) (int, float);

    Così quando ti serve usi FUN e non scrivi la pappardella sopra.
  • Re: I puntatori a funzioni

    Ho provato a modificare il programma iniziale provado a mettere il puntatore alla funzione quando avviene la stampa ma mi da errore...
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char carattere;
    //    int numero=0;
    
        printf("DIGITARE UNA CARATTERE: ");
        scanf("%c", &carattere);
    
       printf("Valore numerico: %c -> %d",int (*funzione)(char),char x);
        return 0;
    } //end main
    
  • Re: I puntatori a funzioni

    Ma scusami che cosa vuoi fare? Qual è l'obiettivo?
  • Re: I puntatori a funzioni

    Vorrei utilizzare questa tecnica per creare un piccolo convertitore caratteri->codice ASCII
  • Re: I puntatori a funzioni

    @coppolino, non puoi sperare di imparare a programmare andando a casaccio e senza studiare!
    E si studia sui libri non spulciando Internet o via post nei forum.

    1) non ti serve un puntatore a funzione per convertire un catattere in codice ASCII! I caratteri SONO GIA' rappresentati in ASCII

    2) nel tuo ultimo post con il codice, quello che hai scritto NON HA SENSO, sintomo che non hai minimamente capito l'esempio precedente e la spiegazione di SVNiko!

    Riapriti quel benedetto libro al capitolo relativo ai puntatori alle funzioni, e STUDIA!
    E se non hai un libro, COMPRALO!
  • Re: I puntatori a funzioni

    Ho semplicemente chiesto un aiuto sul forum in quanto studiando dal libro non ho capito bene l'argomento.
    In ogni caso chiedo scusa se ho esagerato senza rendermene conto.
  • Re: I puntatori a funzioni

    Non è che hai esagerato, il punto è che quando si studia, si procede per gradi di difficoltà crescente.

    Ti faccio una domanda hai studiato e compreso che cosa sono i puntatore ad una variabile? A che cosa servono? Come vanno usati?

    Se lo hai fatto allora il passo al puntatore a funzione è immediato o quasi. Se non lo hai fatto allora prova a farlo e fai tranquillamente domande al forum per farti dare spiegazioni in merito.

    Però procedi sempre per gradi e cerca di comprendere sempre qual è l'obiettivo che ci si prefigge e quale può essere l'esigenza di una determinata cosa. Ti aiuterà a capire bene le cose.
  • Re: I puntatori a funzioni

    Grazie per il consiglio
    Ciao e grazie
Devi accedere o registrarti per scrivere nel forum
14 risposte