Funzioni che ritornano valori di tipo puntatore

di il
4 risposte

Funzioni che ritornano valori di tipo puntatore

Ciao ragazzi!
Ho questo esercizio da svolgere:
Scrivere un programma in linguaggio C che realizzi la seguente funzione: char* cifraFrase(char Frase[], int nA, char (*f)(char c, shift s)) che prende in ingresso un array contenente i caratteri che formano una parola o frase (una stringa), alloca dinamicamente un nuovo array di caratteri ed assegna ad ogni posizione il risultato della funzione crittaCarattere al rispettivo carattere nell'array originario. Infine restituisce il nuovo array.

Naturalmente non vi sto chiedendo di postarmi il codice, ma non ho ben chiaro funzioni di questo tipo :
char* cifraFrase(char Frase[], int nA, char (*f)(char c, shift s))
Mi potreste spiegare perché, come e quando usarle? Sempre parlando del prototipo della funzione qui sopra, char (*f)(char c, shift s) cos'è? Da quello che ho capito sembra una funzione dentro una funzione (?). Shift s è un tipo di dato?!
Grazie

4 Risposte

  • Re: Funzioni che ritornano valori di tipo puntatore

    Iniziamo con la versione semplice:
    char (*f)(char c, int i)
    questa e' la dichiarazione di un puntatore ad una funzione che riceve in ingresso un carattere ed un intero e ritorna un carattere

    Supponi di avere il seguente codice:
    
    
    char converti(char c, int i)
    {
        return (char)(c+i);
    }
    
    
    allora puoi scrivere:
    
    
    char (*f)(char c, int i);
    
    f = converti;
    
    
    A questo punto puoi usare f invece che converti:
    
    char c = (*f)('A', 0)
    
    A che serve i puntatori a funzione?

    Banale: poter utilizzare diverse funzioni di conversione senza dover cambiare o ricompilare il codice che le utilizza.

    Concettualmente: il codice che utilizza la funzione di conversione non e' interessato a come viene fatta la conversione, ed particolare a quale funzione chiamare, ma solo che deve essere fatta.

    Quale funzione chiamare potrebbe essere deciso in fase di configurazione del programma, operazione fatta alla partenza.

    Secondo: che cosa e' shift.

    Ovviamente e' un tipo di dato, ma non e' un tipo predefinito dal linguaggio.

    Molto probabilmente e' un intero, che serve per implementare il seguente ragionamento:

    tu mi passi il carattere c, io a c aggiungo 'shift' e applico l'algoritmo di cifratura.

    Ad esempio, se lo shift e' 3, e viene passato 'a', il carattere da cifrare sara' 'd' (ovviamente, e se viene passato 'z' ?).
  • Re: Funzioni che ritornano valori di tipo puntatore

    
    char converti(char c, int i)
    {
        return (char)(c+i);
    }
    
    Con return (char)(c+i); ritorni praticamente la somma tra c ed i eseguendo il cast, giusto?
    
    char converti(char c, int i)
    {
        return (char)(c+i);
    }
    main()
    {
    char (*f)(char c, int i);
    
    f = converti;
    }
    
    Sarebbe tutto un unico frammento di codice questo qui sopra?
    Io credevo che char (*f)(char c, int i); fosse una dichiarazione di una funzione!

    Dunque quando voglio dichiarare un puntatore ad una funzione, la sintassi è sempre questa? Cioè, nella dichiarazione del puntatore ci devono essere gli stessi tipi di dato presenti nel prototipo della funzione per il quale verrà utilizzato?

    Comunque se viene passato 'z', dovrebbe essere 'c' se lo shift è di tre.
  • Re: Funzioni che ritornano valori di tipo puntatore

    Puntatori a funzione http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/21Puntfunz.html
  • Re: Funzioni che ritornano valori di tipo puntatore

    Comunque se viene passato 'z', dovrebbe essere 'c' se lo shift è di tre.
    No, perchè i char assumono i simboli della tabella ascii.

    Es char c=97; // 'a'
Devi accedere o registrarti per scrivere nel forum
4 risposte