Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 44
  1. #1

    puntatori a funzione - come funzionano?

    Salve,

    Sto studiano i puntatori, e sono arrivato ai puntatori a funzione.
    Ma qui sono in stallo, perché non posso andare avanti senza aver capito come funzionano. Facendo una ricerca non ho trovato niente, e quindi credo sia cosa buona e giusta chiedere aiuto a Voi.
    Magari specificando anche l'utilità; senza l'utilizzo di typedef.

    Grazie per l'attenzione,
    signore del tempo.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    L'utilità dei puntatori a funzione è questa. Hai una funzione generica che compie sempre la stessa sequenza di azioni su un'oggetto, una di questa azioni deve cambiare, al posto di scrivere svariate volte la stessa funzione la scrivi una sola volta e passi come parametro una funzione che svolga questa azione.
    Ad esempio è utile un puntatore a funzione con le liste e le funzioni di folding e mapping.
    codice:
    return_type (*nome_variabile) (type1, type2 ... typen);
    Esempio:

    codice:
    int apply (int a, int b, int (*azione) (int, int)) {
      return (*azione)(a, b);
    }
    
    int sum (int a, int b) {
      return a + b;
    }
    
    int prod (int a, int b) {
      return a * b;
    }
    
    int main () {
      printf("%d\t%d", apply(2, 3, &sum), apply(2, 3, &prod));
    }
    Volendo essere del tutto rigidi, in realtà anche:
    codice:
    return azione(a, b);
    apply(2, 3, sum);
    apply(2, 3, prod);
    Funzionano con praticamente tutti i compilatori, anzi sono più usati: non trovi mai l'& prima del nome della funzioni, quasi nessuno deferenzia il puntatore alla chiamata.
    Ovviamente l'esempio postato non è di grande utilità...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3

    Moderazione

    Il linguaggio di riferimento qui è C, C++ o altro?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Parliamo di C++.
    E' andata via la corrente per quasi due ore, e non mi faceva modificare
    @Scara95
    Quindi la funzione apply(), prenderà come parametro int a, int b, ed il risultato della funzione che gli passiamo al momento della chiamata?

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da signoredeltempo
    Parliamo di C++.
    E' andata via la corrente per quasi due ore, e non mi faceva modificare
    @Scara95
    Quindi la funzione apply(), prenderà come parametro int a, int b, ed il risultato della funzione che gli passiamo al momento della chiamata?
    No, non il risultato della funzione, ma un puntatore a quella funzione. La funzione viene richiamata all'interno!

    Comunque in C++ esistono i function objects...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct Node {
       int value;
       struct Node *next;
    } Node;
    
    typedef Node *List;
    
    #define EmptyList NULL
    
    List _Linsert(List a, int e) {
       List new = (List)malloc(sizeof(Node));
       new->value = e;
       new->next = a;
       return new;
    }
    
    #define Linsert(a,e) ((a) = _Linsert((a), (e)))
    
    void Lfree(List a) {
       if(a == EmptyList)
       	return;
       Lfree(a->next);
       free(a);
    }
    
    void Lprint(List a) {
       if(a==EmptyList)
       	return;
       printf("%d ", a->value);
       Lprint(a->next);
    }
    
    int Lfoldl(int (*f) (int, int), int acc, List l) {
       if(l == EmptyList)
       	return acc;
       return Lfoldl(f, (*f) (acc, l->value), l->next);
    }
    
    int sum(int a, int b) {
       return a+b;
    }
    
    int prod(int a, int b) {
       return a*b;
    }
    
    int main() {
       srand(10);
       int i;
       List l = EmptyList;
       for(i = 0; i < 5; i++)
       	l = _Linsert(l, rand() % 10 + 1);
       Lprint(l);
       printf("\n%d\n%d\n", Lfoldl(&sum, 0, l), Lfoldl(&prod, 1, l));
       Lfree(l);
       getchar();
       return 0;
    }
    Questo è un esempio più completo, è in C, ma in C++ funziona uguale, percui...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Ma lo fai apposta?
    Cioè io ti chiedo di spiegare un determinato argomento, e tu vai completamente fuori?
    E' come se io ti chiedessi di parlarmi della jaguar x type, e tu dici che la bugatti veyron ss 16.4 va meglio.
    A cosa serve scrivere del codice (inutile) che non posso capire? Per me non è un problema, anzi, ma non voglio farti perdere più tempo del necessario.
    E lo scritto anche nel primo post..
    Se sei in grado di spiegarlo senza andare OT, te ne sarei grato, altrimenti lo faccia qualcun altro.
    O magari dimmi dove lo hai appreso, o qualche link che lo spieghi.
    Buon Ferragosto.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <cstdio>
    #include <cstdlib> 
    #include <ctime>
    
    struct Node{
       int value;
       Node *next;
    };
    
    typedef Node *List;
    
    #define EmptyList NULL
    
    List _Linsert(List a, int e) {
       List ret = new Node();
       ret->value = e;
       ret->next = a;
       return ret;
    }
    
    #define Linsert(a,e) ((a) = _Linsert((a), (e)))
    
    void Lfree(List a) {
       if(a == EmptyList)
       	return;
       Lfree(a->next);
       delete a;
    }
    
    void Lprint(List a) {
       if(a==EmptyList)
       	return;
       printf("%d ", a->value);
       Lprint(a->next);
    }
    
    int Lfoldl(int (*f) (int, int), int acc, List l) {
       if(l == EmptyList)
       	return acc;
       return Lfoldl(f, (*f) (acc, l->value), l->next);
    }
    
    int sum(int a, int b) {
       return a+b;
    }
    
    int prod(int a, int b) {
       return a*b;
    }
    
    int main() {
       srand(time(NULL));
       int i;
       List l = EmptyList;
       for(i = 0; i < 5; i++)
       	l = _Linsert(l, rand() % 10 + 1);
       Lprint(l);
       printf("\n%d\n%d\n", Lfoldl(&sum, 0, l), Lfoldl(&prod, 1, l));
       Lfree(l);
       getchar();
       return 0;
    }
    Adesso è C++.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9

    Moderazione

    @signoredeltempo: immagino che non fosse tua intenzione, ma il tuo messaggio suona piuttosto scortese nei confronti di chi ha probabilmente perso del tempo per trovarti un esempio di uso dei puntatori a funzione... se possibile in futuro cerca di puntualizzare il problema senza fare sarcasmo.

    @Scara95: in effetti forse fornire del codice relativo al "reduce" di una lista (che presenta le complicazioni aggiuntive relative alla gestione di una lista) è un po' eccessivo e perde di vista il punto cruciale della questione; può avere più senso un esempio analogo su un vettore C (magari lo posto io dopo pranzo).

    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589

    Re: Moderazione

    Originariamente inviato da MItaly
    In effetti forse fornire del codice relativo al "reduce" di una lista (che presenta le complicazioni aggiuntive relative alla gestione di una lista) è un po' eccessivo e perde di vista il punto cruciale della questione; può avere più senso un esempio analogo su un vettore C (magari lo posto io dopo pranzo).

    Io infatti ho postato 2 esempi, il primo serviva solo a presentarne il funzionamento, una semplice funzione apply di poca utilità, poi, visto che, sempre nel suo post iniziale, chiedeva una situazione reale di utilità dei puntatori a funzione, ho presentato un caso in cui possa avere un senso il loro utilizzo.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.