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

    puntatori a funzione

    salve ragazzi,

    ho qualche difficoltà con i puntatori a funzione.....

    se scrivo

    int *funzione (int a, int b[]);

    scrivo il prototipo di una funzione che restituisce un puntatore ad un intero !

    mentre se scrivo

    int (*funzione) (int a, int b[]);

    è una inizializzazione di un puntatore ad una funzione che riceve due parametri (un intero ed un vettore di interi) e restituisce un intero .... giusto?

    ma il riferimento del puntatore dove va risolto, o avviene automaticamente nella dicitura

    int (*funzione) ...... ?

    Un altra domanda:
    ma c sono sempi pratici di utilizzo di cose del genere?
    Sui libri che ho, riporta semplicemente esempi di menù !
    Ma se propio devo fare un menù lo faccio con uno switch in un do while mi sembra più comodo? o no?
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: puntatori a funzione

    Originariamente inviato da donato.sciarra
    int *funzione (int a, int b[]);

    scrivo il prototipo di una funzione che restituisce un puntatore ad un intero !
    Esatto

    Originariamente inviato da donato.sciarra
    mentre se scrivo

    int (*funzione) (int a, int b[]);

    è una inizializzazione di un puntatore ad una funzione che riceve due parametri (un intero ed un vettore di interi) e restituisce un intero .... giusto?
    Hai appena dichiarato una variabile di tipo puntatore a funzione. A questa variabile puoi assegnare l'indirizzo di una funzione di tipo compatibile con quanto dichiarato.

    Originariamente inviato da donato.sciarra
    ma il riferimento del puntatore dove va risolto, o avviene automaticamente nella dicitura

    int (*funzione) ...... ?

    Un altra domanda:
    ma c sono sempi pratici di utilizzo di cose del genere?
    Sui libri che ho, riporta semplicemente esempi di menù !
    Ma se propio devo fare un menù lo faccio con uno switch in un do while mi sembra più comodo? o no?
    Allora forse è meglio se faccio un esempio più completo. I puntatori a funzione sono tipicamente usati per gestire quelle che vengono chiamate "callback". In pratica si passa ad una certa funzione A un parametro che è un puntatore a funzione B. La funzione A, quando ne ha bisogno, chiama la funzione B tramite il puntatore passato.

    Normalmente è molto comodo definire con typedef un nuovo "tipo" che rappresenta il puntatore a funzione.

    Ecco un semplice esempio:
    codice:
    #include <stdio.h>
    
    typedef void (*PFNSTAMPA) (int);
    
    void stampa_numeri (PFNSTAMPA callback)
    {
        int i;
    
        for (i = 0; i < 5; i++)
            callback (i);
    }
    
    void mia_stampa1 (int num)
    {
        printf ("%d\n", num);
    }
    
    void mia_stampa2 (int num)
    {
        printf ("Numero: %d\n", num);
    }
    
    int main (void)
    {
        stampa_numeri (mia_stampa1);
    
        stampa_numeri (mia_stampa2);
    
        return 0;
    }
    a) Ho creato un nuovo tipo PFNSTAMPA (PFN sta tipicamente per Pointer to function) che è un puntatore alla funzione.
    b) La funzione stampa_numeri genera una sequenza di numeri ma non li stampa, si aspetta come parametro un puntatore alla funzione dichiarata. Che richiama nel ciclo for.
    c) mia_stampa1 e mia_stampa2 sono compatibili con PFNSTAMPA. Nel main chiamo stampa_numeri passando prima una e poi l'altra funzione.

    Il risultato è che stampa_numeri si appoggia al "comportamento" della funzione passata come argomento.

    Spero che il tutto sia chiaro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    grazie davvero molto gentile....

    ....perfetto !

    permettimi di approfittare delle tue conoscenze chidendoti un esmpio su una funzione che restituisce un puntatore...

    int *function (int a, char b[]);/* in questo caso ad un intero*/

    trovi diverse difficoltà nel risolvere il rifermento del puntatore, perchè alla fine dei conti il gioco con i puntatori sta prorpio nel capire bene il riferimento !

    grazie ancora....
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da donato.sciarra
    permettimi di approfittare delle tue conoscenze chidendoti un esmpio su una funzione che restituisce un puntatore...
    Ecco un semplice esempio: una funzione che prende 2 array in input (della stessa lunghezza) e crea/restituisce un nuovo array che contiene la somma degli elementi.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int* somma_array (int *arr1, int *arr2, int num)
    {
        int  i;
        int *arrRes;
    
        arrRes = (int*) malloc (num * sizeof (int));
    
        if (arrRes != NULL)
        {
            for (i = 0; i < num; i++)
                arrRes[i] = arr1[i] + arr2[i];
        }
    
        return arrRes;
    }
    
    int main (void)
    {
        int a[] = { 12, 34 };
        int b[] = { 4, 7 };
        int *r;
    
        r = somma_array (a, b, 2);
    
        if (r != NULL)
        {
            /* ...fai qualcosa con l'array 'r'... */
    
            free (r);
        }
    
        return 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Ho aggiunto il linguaggio al titolo, ma dovrebbe essere inserito già da chi apre la discussione, come da Regolamento.

    In futuro, non si dovrebbe dimenticare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6

    Re: Moderazione

    Originariamente inviato da alka
    Ho aggiunto il linguaggio al titolo, ma dovrebbe essere inserito già da chi apre la discussione, come da Regolamento.

    In futuro, non si dovrebbe dimenticare.
    sorry....! piccola distrazione....

    __________________________________________________ ________________

    andbin spero di poter approfittare della tua pazienza....

    ti ringrazio per la risposta ma...........potresti commentarmelo un tantino?

    il riferimento nn mi è chiaro....

    come lo sto interpretando io:

    1) inizializzi un puntatore ad un intero;
    2) e dopo a questo puntatore C assegni il puntatore che restituisce la funzione somma_array?


    r = somma_array (a, b, 2); come va interpretato il riferimento?
    arrRes non dovrebbe essere semplicemente un variabile intera senza puntatore?

    "I programmatori si possono dividere in 2 categorie: quelli che hanno capito i puntatori e quelli che non li hanno capiti"
    spero col tuo aiuto di rientrare a far parte della prima categoria....
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Re: Moderazione

    Originariamente inviato da donato.sciarra
    arrRes non dovrebbe essere semplicemente un variabile intera senza puntatore?
    arrRes è una variabile "puntatore a int". A questa variabile assegno il puntatore alla area di memoria che la malloc ha allocato dinamicamente.

    Dopodiché restituisco arrRes, in modo che nel main() si possa accedere a quell'area di memoria (che poi libero con free() quando non serve più).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    ti ringrazio davvero tanto !

    potresti consigliarmi qualche libro per esercitarmi su queste cose? perchè mi sa che il Deitel&Deitel che ho, anche se è ottimo come libro, non è molto specifico su queste cose...e tra un mese e mezzo ho un esame e vorrei arrivarci preparato al meglio....

    ....grazie mille cmq...qualcosina l'ho afferrata...
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

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.