Ciao a tutti,
ho dei grossi problemi col capire i puntatori a funzione, vi prego aiutatemi devo fare l'esame.
Allora ho questo codice:
codice:
// versione sviluppata durante l'esercitazione in classe
// (secondo turno)

#include <iostream>
#include <stdlib.h>

using namespace std;
void leggi_vettore(void* & v, int n, int t);
void stampa_vettore(void* v, int n, int t); //(perchè decido io se sarà un unsigned short o float) Al tempo di compilazione, non è noto il tipo di dato puntato, ma esso sarà noto al tempo di esecuzione
void potenza (void* res, void* a, void* b, int t);
void divisione (void* res, void* a, void* b, int t);
//Definisco puntatore a funzione
typedef void (*pfunz)(void*, void*, void*, int); //senza le due parentesi sarebbe interpretata dal compilatore come la dichiarazione di una funzione il cui tipo di ritorno è un puntatore a void, mentreè un puntatore a funzione che ritorna un void(verrà assegnata a tempo di ese late binding)
//Funzione che crea puntatori a funzione
pfunz* produci_pfunz (int n); //questa è la funzione
void* produci_vettore (void* v1, void* v2, int n, pfunz f[], int t);

int main(int argc, char *argv[])
{
  void * v1, * v2, *res;
  int n, t;
  pfunz * pf; //??questo qui è un puntatore a funzione o altro?
 
  
  cout << "\n inserire il tipo degli elementi(0 = unsigned short, 1 = float)" << endl;
  cin >> t;
  cout << "\n inserire il numero degli elementi di v1 e v2: " << endl;
  cin >> n;
  
  leggi_vettore(v1, n, t);
  stampa_vettore(v1, n, t);
  leggi_vettore(v2, n, t);
  stampa_vettore(v2, n, t);
  
  pf=produci_pfunz(n);
  
  res=produci_vettore(v1,v2,n,pf,t);
  stampa_vettore(res, n, t);
  
  cout << "\n";
  system("PAUSE");	
  return 0;
}

void leggi_vettore(void * & v, int n, int t) {
    
    switch (t) {
        case 0: v= new unsigned short [n]; break;
        case 1: v= new float [n];break;
    }  
    
    cout << "\n inserisci gli elementi del vettore: " << endl;
    for(int i=0; i<n; i++) // basta un solo ciclo...
    switch (t) {
        case 0: 
           //  for(int i=0; i<n; i++) ...in alternativa
             cin >> *((unsigned short *)v+i); break;
        case 1: 
           // for(int i=0; i<n; i++) ...in alternativa
             cin >> *((float *)v+i);break;
    }      
}   
 
void stampa_vettore(void* v, int n, int t){
    cout << "\n stampa degli elementi del vettore: " << endl;
    for(int i=0; i<n; i++)
    switch (t) {
        case 0: cout << *((unsigned short *)v+i)<< endl;;
                break;
        case 1: cout << *((float *)v+i)<< endl;
                break;
    }      
    
}

pfunz* produci_pfunz (int n) { //INDICA SOLO IL TIPO DEL VALORE RITORNATO NON IL VALORE REALE DI RITORNO
    
    pfunz * pf= new pfunz[n];
    for (int i=0; i<n; i++)
    {
        cout<<"i%2 vale: "<<i%2<<endl;
     switch(i%2) {
         case 0:  pf[i]=potenza; break;
         case 1:  pf[i]=divisione; break; 
         
     }
     }    
    return pf;
}   

void* produci_vettore (void* v1, void* v2, int n, pfunz f[], int t) {
    void * res;
    switch (t) {
        case 0: res= new unsigned short [n]; break;
        case 1: res= new float [n];break;
    }  
  
  for(int i=0; i<n; i++)
    switch (t) {
        case 0: f[i]( (unsigned short *)res+i, (unsigned short *)v1+i, (unsigned short *)v2+i, t); //?questa qui è una funzione o che cosa?  e a cosa serve tutta sta riga??
        cout <<"*res+i vale: "<<(unsigned short *)res[i];break;                 //<<"v1+i vale: "<<*(v1+i)<<"v2+i vale: "<<*(v2+i)<< perchè se metto res+i senza unsi* mi dice 101 C:\Users\Mario\Desktop\Eser\ptrfnz\mainprova2.cpp pointer of type `void *' used in arithmetic, io non dovrei avergli già fatto capire che è diventato un array a unsigned short?
        case 1: f[i]( (float *)res+i, (float *)v1+i, (float*)v2+i, t); break; //ma pf[i] dovrebbe corrispondere a f[i]??non ci capisco niente
    }  
return res; 
}
come vedete ho scritto delle osservazioni:
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);

Raga scusatemi veramente, ma ste cose non mi sono per niente chiare leggo sul libro sembra tutto facile, poi vai alla pratica e diventa impossibile, se non mi aiutate voi del forum non so come fare