1. pf=produci_pfunz(n);Originariamente inviato da ar146
1-pfunz è un puntatore a funzione(ma a quale funzione punta in questo listato?)
2-definisco una funzione produci_pfunz che ritorna pfunz*, ma perchè?
3-in void* produci_vettore c'è pfunz f[], allora f[] dovrebbe essere un array, ma allora sarebbe un array di puntatori a funzione? e se si perchè si devono usare questi costrutti così complessi? Non li riesco a capire nella realtà
4-pfunz * pf è una variabile di tipo puntatore a funzione che mi dovrebbe puntare alla funzione produci_pfunz(n),vero?
5-ma perchè esistono due funzioni una per scegliere se fare potenza o divisione e l'altra per costruire un puntatore ad array, dov'è l'utilità?
6-nella funzione void* produci_vettore
f[i]( (unsigned short *)res+i, che sarebbe la chiamata di una funzione(anche se ci sono le parentesi quadreche darebbero voce ad un array) e all'interno valuta res, v1+i,v2+i, ma se io ad esempio do 12,4 per v1 2,4per v2 i risultati che mi da il codice sono 24 e 1 perchè ha usato tutta sta riga:
f[i]( (unsigned short *)res+i, (unsigned short *)v1+i, (unsigned short *)v2+i, t);
Quello che ti deve esser chiaro dei puntatori a funzione è che posson puntare a qualunque funzione che abbia la signature (tipo di valore di ritorno, numero e tipo di parametri) richiesta.
In questo caso punta al valore di ritorno di produci_pfunz.
2. Questo esempio è la versione piu semplice di una che avevo visto su qualche altro libre che al contrario avev quattro possibili funzioni cui puntare. L'idea è che a seconda della operazione che vuoi, la funzione ti ritorna la funzione corretta. La tipologia è indicata dal valore dell'array.
3. Non so se il codice che hai postato compili, non sono su unix al momento. Tuttavia ad esempio, in produci_pfunz vedo variabili tipo potenza che appaion dal nulla.
L'idea del giochino che vuole fare è quella spiegata al punto 2. Tu hai un array di funzioni con la stessa signature ma con utilita diversa, ed a seconda di quello che vuoi fare fai puntare dinamicamente al tuo puntatore ad una di loro.
4. Al suo valore di ritorno. Questo lo vedi al volo perche produci_pfunz(n) ha una signature diversa da quella richiesta dal puntatore.
5. Forse avrebbe piu senso un esempio legato a cosa fare quando premi il tasto destro del mouse. A seconda del contesto in cui ti trovi ti si apre un menu diverso. Questo pero lo sai solo real time. Nel caso avresti un puntatore a funzione che regola i vari menu. Ed il menu verrebbe assegnato alla funzione al volo.
L'esempio di per se, come ti dicevo, sembra una versione presa da un altro libro (anche se ridotta) e non ha alcuna utilita reale.
6. Come puoi notare li hai esattamente i quattro parametri richiesti dal puntatore a funzione... tre puntatori ed un intero.
Ti faccio un esempio spero piu semplice dell'utilità di un puntatore a funzione. Immagina di avere un oggetto del tipo:
struct linkedlist{
void *obj;
struct linkedlist *next;
};
Se crei tanti oggetti di questo tipo ed al primo fai puntare, tramite next, al secondo, il secondo al terzo e cosi via crei una linked list. Ogni oggetto contiene un qualunque tipo di oggetto identificato da void *obj.
Questo ti da massima autonomia sul tipo di oggetto contenuto in obj. Tuttavia, tu che implementi questa libreria, non hai idea di cosa l'utente ci vada a mettere. Come puoi quindi preparargli una funzione di stampa?
extern void linkedlist_print(struct linkedlist *, void (*)(void *));
void linkedlist_print(struct linkedlist *first, void (*pfun)(void *asd)){
struct linkedlist *current = NULL;
for(current = first; current != NULL; current = current->next)
pfun(current->obj);
}
L'idea è appunto un puntatore a funzione. Tu indichi all'utente che deve passarti la lista da stampare ed un puntatore ad una funzione che lui ha creato, sapendo come stampare il suo oggetto. Gli dici tuttavia la signature che questa funzione deve avere.
Mi auguro di non averti incasinato ancor di piu. I puntatori a funzione son un argomento particolarmente ostico.