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: