[C++]Puntatori a void e puntatori a funzione
Ciao a tutti... sto cominciando a studiare i puntatori a void e i puntatori a funzioni e sto sercando si svolgere questo esercizio:
Scrivere un programma che legga due vettori A e B aventi lo stesso numero di elementi e produca un terzo vettore C della stessa dimensione. Gli elementi dei vettori possono essere tutti di tipo unsigned short oppure tutti di tipo float, sulla base di un valore immesso dall'utente. Gli elementi del vettore C sono ottenuti nel modo seguente:
$C = (A)/(B)$ se i è dispari
$C = (A)^(B)$ se i è pari
devo implemementare le seguenti funzioni:
void leggi_vettore(void* & v, int n, int t) (alloca dinamicamente i vettori A e B e e legge i valori da tastiera)
pfunz* produci_pfunz (int n) (alloca dinamicamente un vettore di n puntatori a funzione ed inizializza gli elementi alle funzioni divisione e potenza)
void* produci_vettore (void* v1, void* v2, int n, pfunz f[], int t) (alloca dinamicamente il vettore C e poi esegue un ciclo per calcolare ciascuno il suo elemento i-esimo invocando la funzione f)
void stampa_vettore(void* v, int n, int t) (stampa il vettore C)
void potenza (void* res, void* a, void* b, int t)
void divisione (void* res, void* a, void* b, int t)
v è appunto un puntatore a void, n è la dimensione dei vettori e t serve per fare la scelta tra i due tipi
ora io ho implementato la funzione leggi_vettore in questo modo e credo sia giusto:
ora però mi sono bloccato non riesco a capire come creare un vettore di puntatori a funzione e inizializzarlo alle funzioni potenza e divisione sulla base di una scelta del tipo da parte dell'utente... forse sarà una cosa semplicissima ma è la prima volta ke vedo queste cose e vorrei cercare di capire bene come funzionano. Grazie dell'attenzione.
Scrivere un programma che legga due vettori A e B aventi lo stesso numero di elementi e produca un terzo vettore C della stessa dimensione. Gli elementi dei vettori possono essere tutti di tipo unsigned short oppure tutti di tipo float, sulla base di un valore immesso dall'utente. Gli elementi del vettore C sono ottenuti nel modo seguente:
$C = (A)/(B)$ se i è dispari
$C = (A)^(B)$ se i è pari
devo implemementare le seguenti funzioni:
void leggi_vettore(void* & v, int n, int t) (alloca dinamicamente i vettori A e B e e legge i valori da tastiera)
pfunz* produci_pfunz (int n) (alloca dinamicamente un vettore di n puntatori a funzione ed inizializza gli elementi alle funzioni divisione e potenza)
void* produci_vettore (void* v1, void* v2, int n, pfunz f[], int t) (alloca dinamicamente il vettore C e poi esegue un ciclo per calcolare ciascuno il suo elemento i-esimo invocando la funzione f)
void stampa_vettore(void* v, int n, int t) (stampa il vettore C)
void potenza (void* res, void* a, void* b, int t)
void divisione (void* res, void* a, void* b, int t)
v è appunto un puntatore a void, n è la dimensione dei vettori e t serve per fare la scelta tra i due tipi
ora io ho implementato la funzione leggi_vettore in questo modo e credo sia giusto:
void leggiVettore(void *&v, int n, int t){ switch(t){ case 1:{ unsigned short *u = new unsigned short[n]; for(int i=0;i<n;i++){ cout<<"Inserisci il "<<i+1<<"o numero unsigned short: "; cin>>u[i]; v = u; } cout<<"Il vettore e':\n"; for(int i=0;i<n;i++){ cout<<" "<<u[i]; } cout<<endl; break; } case 2:{ float *f = new float[n]; for(int i=0;i<n;i++){ cout<<"Inserisci il "<<i+1<<"o numero float: "; cin>>f[i]; v = f; } cout<<"Il vettore e':\n"; for(int i=0;i<n;i++){ cout<<" "<<f[i]; } cout<<endl; break; } } }
ora però mi sono bloccato non riesco a capire come creare un vettore di puntatori a funzione e inizializzarlo alle funzioni potenza e divisione sulla base di una scelta del tipo da parte dell'utente... forse sarà una cosa semplicissima ma è la prima volta ke vedo queste cose e vorrei cercare di capire bene come funzionano. Grazie dell'attenzione.
Risposte
ho dichiarato con il tipo puntatore a funzione così:
è corretto?
poi la funzione produci_pfunz l'ho implementata così:
è giusto così?
per il momento il compilatore non mi dà errori, ma nelle funzioni potenza e divisione mi da errore:
c'è qualcuno che potrebbe darmi una mano? vorrei cercare di capire bene questo argomento. Grazie infinite.
typedef void (*pfunz)(void*,void*,void*,int);
è corretto?
poi la funzione produci_pfunz l'ho implementata così:
pfunz* produciPfunz(int n) { pfunz* pf = new pfunz[n]; for(int i=0;i<n;i++) { if(i%2==0) { pf[i]=&potenza; } else { pf[i]=&divisione; } } return pf; }
è giusto così?
per il momento il compilatore non mi dà errori, ma nelle funzioni potenza e divisione mi da errore:
void potenza(void* res, void* a, void* b, int t) { switch(t) { case 1: { unsigned short *u = new unsigned short; res = pow(a,b); res = u; } case 2: { float *f = new float; res = pow(a,b); res = f; } } } void divisione(void* res, void* a, void* b, int t) { switch(t) { case 1: { unsigned short *u = new unsigned short res = a/b; res = u; } case 2: { float *f = new float; res = a/b; res = f; } } }
c'è qualcuno che potrebbe darmi una mano? vorrei cercare di capire bene questo argomento. Grazie infinite.

Della serie "come complicarsi la vita" 
C'è un refuso, manca un ';' nella creazione del nuovo unsigned short, funzione divisione. E non ho capito perché hai definito pfunz a quel modo... un bel void pointer non andava bene?
A parte questo, che errore ti dà? Non credo sia un errore di compilazione.

C'è un refuso, manca un ';' nella creazione del nuovo unsigned short, funzione divisione. E non ho capito perché hai definito pfunz a quel modo... un bel void pointer non andava bene?
A parte questo, che errore ti dà? Non credo sia un errore di compilazione.
allora innanzitutto grazie per aver risposto 
allora per quanto riguarda il ";" è stato un mio errore di copia e incolla del codice
per la dichiarazione di pfunz il modo ke ho scritto è sbagliato? avrei dovuto fare così?
typedef void* pfunz();
perfavore un piccolo aiuto su questo argomento non mi farebbe male dato ke è la prima volta ke incontro queste cose
poi per quanto riguarda l'errore, per la funzione potenza è il seguente:
cannot convert 'void*' to 'double' for argument '1' to 'double pow(double, double)'
mentre per la funzione divisione è il seguente:
invalid operands of types 'void*' and 'void*' to binary 'operator/'
Grazie ancora

allora per quanto riguarda il ";" è stato un mio errore di copia e incolla del codice

per la dichiarazione di pfunz il modo ke ho scritto è sbagliato? avrei dovuto fare così?
typedef void* pfunz();
perfavore un piccolo aiuto su questo argomento non mi farebbe male dato ke è la prima volta ke incontro queste cose


poi per quanto riguarda l'errore, per la funzione potenza è il seguente:
cannot convert 'void*' to 'double' for argument '1' to 'double pow(double, double)'
mentre per la funzione divisione è il seguente:
invalid operands of types 'void*' and 'void*' to binary 'operator/'
Grazie ancora

"TheBestNapoli":
avrei dovuto fare così?
typedef void* pfunz();
Io avrei fatto così:
typedef void* pfunz;
cannot convert 'void*' to 'double' for argument '1' to 'double pow(double, double)'
Certo. 'pow' ritorna un double; quindi devi usare un double (nel tuo caso va bene un float, 'f' che magari forzi in typecast) e ne passi l'indirizzo al tuo res (che è un puntatore), qualcosa tipo
float f=new float; f=(float) pow(a, b); res=&f;
analogamente per l'altro caso, ma non usare pow(), usa l'elevamento a potenza.
invalid operands of types 'void*' and 'void*' to binary 'operator/'
Anche qui, analogo discorso. Rivedi il funzionamento sulla base delle indicazioni di cui sopra: '/' è un operatore che accetta valori, non puntatori.
se dichiaro pfunz come hai scritto mi da errore nella funzione produci_pfunz quando assegno a pf l'indirizzo delle funzioni potenza e divisione:
invalid conversion from 'void (*)(void*, void*, void*, int)' to 'void*'
ma può essere che ho sbagliato io l'implementazione della funzione produci_pfunz e che la tua dichiarazione sia corretta

poi per quanto riguarda le funzioni potenza e divisione le ho riscritte in questo modo:
cioè in pratica ho assegnato il tipo ai puntatori a void dichiarati nel prototipo delle funzioni e poi ho fatto l'operazioni di potenza e divisione... in questo modo non mi dà nessun errore e inoltre l'IDE su cui sto scrivendo il codice mi ha riconosciuto la funzione pow() della libreria math.h evidenziandomela con un altro colore mentre prima era scritta allo stesso modo del resto del codice... forse è un segno che sto sulla strada giusta?
anche perchè se metto ad esempio nelle funzione potenza il tuo procedimento in questo modo:
mi dà sempre l'errore:
cannot convert 'void*' to 'double' for argument '1' to 'double pow(double, double)'
forse ho mancato qualcosa? il codice che ho scritto io va bene o è una grande baggianata?
Grazie ancora
invalid conversion from 'void (*)(void*, void*, void*, int)' to 'void*'
ma può essere che ho sbagliato io l'implementazione della funzione produci_pfunz e che la tua dichiarazione sia corretta


poi per quanto riguarda le funzioni potenza e divisione le ho riscritte in questo modo:
void potenza(void* res, void* a, void* b, int t){ switch(t){ case 1:{ unsigned short *u = new unsigned short; unsigned short *r = (unsigned short*)(res); unsigned short *c = (unsigned short*)(a); unsigned short *d = (unsigned short*)(b); *r = pow(*c,*d); r = u; break; } case 2:{ float *f = new float; float *r = (float*)(res); float *c = (float*)(a); float *d = (float*)(b); *r = pow(*c,*d); r = f; break; } } } void divisione(void* res, void* a, void* b, int t){ switch(t){ case 1:{ unsigned short *u = new unsigned short; unsigned short *r = (unsigned short*)(res); unsigned short *c = (unsigned short*)(a); unsigned short *d = (unsigned short*)(b); *r = (*c)/(*d); r = u; break; } case 2:{ float *f = new float; float *r = (float*)(res); float *c = (float*)(a); float *d = (float*)(b); *r = (*c)/(*d); r = f; break; } } }
cioè in pratica ho assegnato il tipo ai puntatori a void dichiarati nel prototipo delle funzioni e poi ho fatto l'operazioni di potenza e divisione... in questo modo non mi dà nessun errore e inoltre l'IDE su cui sto scrivendo il codice mi ha riconosciuto la funzione pow() della libreria math.h evidenziandomela con un altro colore mentre prima era scritta allo stesso modo del resto del codice... forse è un segno che sto sulla strada giusta?

anche perchè se metto ad esempio nelle funzione potenza il tuo procedimento in questo modo:
void potenza(void* res, void* a, void* b, int t){ switch(t){ case 1:{ unsigned short *u = new unsigned short; u = (unsigned short) pow(a,b); res = &u; break; } case 2:{ float *f = new float; f = (float) pow(a,b); res = &f; break; } } }
mi dà sempre l'errore:
cannot convert 'void*' to 'double' for argument '1' to 'double pow(double, double)'
forse ho mancato qualcosa? il codice che ho scritto io va bene o è una grande baggianata?


Mi sembra comunque che ti stia complicando le cose...
Scusa, puoi provare questa implementazione della tua funzione potenza
e vedere se ti va? Se qualcosa non ti è chiaro, lo spiego volentieri (e anche se ho fatto errori, va da sé).
Scusa, puoi provare questa implementazione della tua funzione potenza
void potenza(void* res, void* a, void* b, int t) { double r; // usato per pow() unsigned int ri; float rf; r = pow((double) *(double *)a, (double) *(double *)b); if (t == 1) { ri=(unsigned int) r; *(unsigned int *)res=ri; } else { rf=(float) r; *(float *)res=rf; } }
e vedere se ti va? Se qualcosa non ti è chiaro, lo spiego volentieri (e anche se ho fatto errori, va da sé).
La tua dichiarazione di 'pfunz' dovrebbe andare bene (anche se io invece dell'operatore di reference avrei preferito il typecast, ma è questione di lana caprina
).
L'implementazione di esempio (funzione potenza) che ho messo evita di usare new; in teoria però ci sono problemi in quanto non usi mai puntatori a double: sono alternativamente puntatori a unsigned e float (dichiarati però come puntatori a void), e se uso il typecast direttamente recupero sicuramente valori errati, perciò dovrò farne una copia e/o passarli a funzione di conversione. Quindi correggo:
Questa implementazione usa solo typecast per le conversioni (e non funzioni specifiche di conversione, come forse sarebbe più appropriato) e non usa new ma solo variabili (auto) locali. Analogamente si può fare per 'divisione'.
Come vedi è simile alla tua, ma credo sia corretta - quella che hai postato non mi convince proprio.
PS. Quando e se completi l'esercizio (e se ti va) posta qua il risultato, che è interessante di per sé (funzionamento dei puntatori).

L'implementazione di esempio (funzione potenza) che ho messo evita di usare new; in teoria però ci sono problemi in quanto non usi mai puntatori a double: sono alternativamente puntatori a unsigned e float (dichiarati però come puntatori a void), e se uso il typecast direttamente recupero sicuramente valori errati, perciò dovrò farne una copia e/o passarli a funzione di conversione. Quindi correggo:
void potenza(void* res, void* a, void* b, int t) { double r; // risultato di pow() unsigned int ai, bi, ri; // calcolo con interi float af, bf, rf; // calcolo con float if (t == 1) { ai=*(unsigned short *)a; bi=*(unsigned short *)b r = pow((double) ai, (double) bi); ri=(unsigned int) r; *(unsigned int *)res=ri; } else { af=*(float *)a; bf=*(float *)b r = pow((double) af, (double) bf); rf=(float) r; *(float *)res=rf; } }
Questa implementazione usa solo typecast per le conversioni (e non funzioni specifiche di conversione, come forse sarebbe più appropriato) e non usa new ma solo variabili (auto) locali. Analogamente si può fare per 'divisione'.
Come vedi è simile alla tua, ma credo sia corretta - quella che hai postato non mi convince proprio.
PS. Quando e se completi l'esercizio (e se ti va) posta qua il risultato, che è interessante di per sé (funzionamento dei puntatori).
grazie mille!!! ho scritto le funzioni come mi hai suggerito e non mi danno nessun errore (però ora le devo verificare in esecuzione
)... in realtà le avevo modificate in questo modo e più o meno i concetti erano simili (almeno credo
):
però credo che col tuo ragionamento le cose vadano meglio perciò utilizzerò quello
(anche perchè mi sembra più chiaro e corretto)
ora però mi rimane la funzione produciVettore (quella funzione che deve allocare dinamicamente il vettore C e per poi eseguire un ciclo per calcolare ciascuno il suo elemento i-esimo invocando la funzione f)... io l'ho implementata in questo modo:
però quando nel main (dopo aver dichiarato le variabili e scritto le prime funzioni) metto:
mi da il seguente errore (anzi quasi un'orrore!
):
cosa ho sbagliato? grazie ancora per l'attenzione


void potenza(void* res, void* a, void* b, int t) { switch(t) { case 1: { unsigned short *r = (unsigned short*)(res); unsigned short *c = (unsigned short*)(a); unsigned short *d = (unsigned short*)(b); *r = pow(*c,*d); res = r; break; } case 2: { float *r = (float*)(res); float *c = (float*)(a); float *d = (float*)(b); *r = pow(*c,*d); res = r; break; } } }
però credo che col tuo ragionamento le cose vadano meglio perciò utilizzerò quello


ora però mi rimane la funzione produciVettore (quella funzione che deve allocare dinamicamente il vettore C e per poi eseguire un ciclo per calcolare ciascuno il suo elemento i-esimo invocando la funzione f)... io l'ho implementata in questo modo:
void* produciVettore(void* v1, void* v2, int n, pfunz f[], int t) { void* s; switch(t) { case 1: { unsigned short *v = new unsigned short[n]; unsigned short *A = (unsigned short*)(v1); unsigned short *B = (unsigned short*)(v2); for(int i=0;i<n;i++) f[i](v+i,A+i,B+i,t); s = v; break; } case 2: { float *v = new float[n]; float *A = (float*)(v1); float *B = (float*)(v2); for(int i=0;i<n;i++) f[i](v+i,A+i,B+i,t); s = v; break; } } return s; }
però quando nel main (dopo aver dichiarato le variabili e scritto le prime funzioni) metto:
v3=produciVettore(v1,v2,n,f,t);
mi da il seguente errore (anzi quasi un'orrore!

cannot convert 'void (**)(void*, void*, void*, int)' to 'void (*)(void*, void*, void*, int)' for argument '4' to 'void* produciVettore(void*, void*, int, void (*)(void*, void*, void*, int), int)'
cosa ho sbagliato? grazie ancora per l'attenzione

"TheBestNapoli":
... io l'ho implementata in questo modo:
void* produciVettore(void* v1, void* v2, int n, pfunz f[], int t) { //... }
però quando nel main (dopo aver dichiarato le variabili e scritto le prime funzioni) metto:
v3=produciVettore(v1,v2,n,f,t);
mi da il seguente errore (anzi quasi un'orrore!):
cannot convert 'void (**)(void*, void*, void*, int)' to 'void (*)(void*, void*, void*, int)' for argument '4' to 'void* produciVettore(void*, void*, int, void (*)(void*, void*, void*, int), int)'
cosa ho sbagliato?
Leggi attentamente il messaggio di errore. Cosa esattamente è 'f' che passi alla tua funzione produciVettore con
v3=produciVettore(v1, v2, n, f, t)
ovvero l'istruzione di cui sopra? Il compilatore dice che il suo tipo è
void(**)(void*, void*, void*, int)
mentre si aspettava fosse di tipo
void (*)(void*, void*, void*, int)
Quindi: come hai dichiarato 'f'? Cosa è?
allora nell'header.h fo dichiarato il tipo pfunz così:
il main è questo:
e in questo modo mi dà l'errore precedente.
Dopo aver letto e stampato i due vettori assegno a f il puntatore ritornato dalla funzione produciPfunz e poi assegno a v3 il vettore ritornato dalla funzione produciVettore, ma non riesco a venire a capo del problema... forse è una cosa banalissima
ma questo argomento è la prima volta che lo affronto e in questo periodo non ho molto tempo a causa degli altri corsi. Grazie ancora sei stato gentilissimo
typedef void (*pfunz)(void*,void*,void*,int);
il main è questo:
int main() { void* v1; void* v2; void* v3; int n; int t; pfunz *f; cout<<"Inserisci la dimensione dei vettori: "; cin>>n; cout<<"Inserisci il tipo di dato:\n"; cout<<" 1) Unsigned Short\n" <<" 2) Float\n"; cin>>t; while(t!=1&&t!=2) { cout<<"ERRORE: Inserire valore corretto:\n"; cin>>t; } cout<<"Primo vettore:\n"; leggiVettore(v1,n,t); stampaVettore(v1,n,t); cout<<"Secondo Vettore:\n"; leggiVettore(v2,n,t); stampaVettore(v2,n,t); f=produciPfunz(n); v3=produciVettore(v1,v2,n,f,t); stampaVettore(v3,n,t); return 0; }
e in questo modo mi dà l'errore precedente.
Dopo aver letto e stampato i due vettori assegno a f il puntatore ritornato dalla funzione produciPfunz e poi assegno a v3 il vettore ritornato dalla funzione produciVettore, ma non riesco a venire a capo del problema... forse è una cosa banalissima


C'è qualcosa che non mi torna... puoi provare a modificare la tua funzione produciVettore in questo modo
e vedere cosa succede?
void* produciVettore(void* v1, void* v2, int n, pfunz *f, int t) {...}
e vedere cosa succede?
funziona!!! GRANDE!!! Il problema quindi era nel prototipo della funzione produciVettore... ma come facevo ad accorgemene se i prototipi delle funzioni sono dati dall'esercizio assegnato dal prof? bah... eppure ho ricontrollato e c'era scritto pfunz f[]... cmq ora grazie a te ho capito e mi torna tutto 
il programma completo se può servire è questo:
header.h
main.cpp
Grazie ancora sei un grande!

il programma completo se può servire è questo:
header.h
#ifndef HEADER_H_ #define HEADER_H_ #include <iostream> #include <math.h> using namespace std; typedef void (*pfunz)(void*,void*,void*,int); void leggiVettore(void* &, int, int &, const char *); pfunz* produciPfunz(int); void* produciVettore (void*, void*, int, pfunz *, int, const char *); void stampaVettore(void*, int, int, const char *); void potenza(void*, void*, void*, int); void divisione(void*, void*, void*, int); #endif /* HEADER_H_ */header.cpp
#include "header.h" void leggiVettore(void *&v, int n, int &t, const char *c) { switch(t) { case 1: { unsigned short *u = new unsigned short[n]; for(int i=0;i<n;i++) { cout<<"Inserisci il "<<i+1<<"o numero unsigned short: "; cin>>u[i]; } v = u; break; } case 2: { float *f = new float[n]; for(int i=0;i<n;i++) { cout<<"Inserisci il "<<i+1<<"o numero float: "; cin>>f[i]; } v = f; break; } } } pfunz* produciPfunz(int n) { pfunz *pf = new pfunz[n]; for(int i=0;i<n;i++) { if(i%2==0) { pf[i]=&potenza; } else { pf[i]=&divisione; } } return pf; } void* produciVettore(void* v1, void* v2, int n, pfunz *f, int t, const char *) { void* s; switch(t) { case 1: { unsigned short *v = new unsigned short[n]; unsigned short *A = (unsigned short*)(v1); unsigned short *B = (unsigned short*)(v2); for(int i=0;i<n;i++) { f[i](v+i,A+i,B+i,t); } s = v; break; } case 2: { float *v = new float[n]; float *A = (float*)(v1); float *B = (float*)(v2); for(int i=0;i<n;i++) { f[i](v+i,A+i,B+i,t); } s = v; break; } } return s; } void stampaVettore(void* v, int n, int t, const char *c) { switch(t) { case 1: { unsigned short *u; u=(unsigned short*)(v); cout<<"Il vettore "<<c<<" di tipo unsigned short e':\n"; for(int i=0;i<n;i++) { cout<<" "<<static_cast<unsigned short*>(v)[i]; } cout<<endl; break; } case 2: { cout<<"Il vettore "<<c<<" di tipo float e':\n"; for(int i=0;i<n;i++) { cout<<" "<<" "<<static_cast<float*>(v)[i]; } cout<<endl; break; } } } void potenza(void* res, void* a, void* b, int t) { double r; unsigned short ai, bi, ri; float af, bf, rf; if(t == 1) { ai = *(unsigned short *)a; bi = *(unsigned short *)b; r = pow((double)ai,(double)bi); ri = (unsigned short)r; *(unsigned short *)res = ri; } else { af = *(float *)a; bf = *(float *)b; r = pow((double)af,(double)bf); rf = (float)r; *(float *)res = rf; } } void divisione(void* res, void* a, void* b, int t) { double r; unsigned int ai, bi, ri; float af, bf, rf; if(t == 1) { ai = *(unsigned short *)a; bi = *(unsigned short *)b; r = ((double) ai)/((double) bi); ri=(unsigned int)r; *(unsigned int *)res=ri; } else { af = *(float *)a; bf = *(float *)b; r = ((double)af)/((double) bf); rf=(float)r; *(float *)res = rf; } }
main.cpp
#include "header.h" int main() { void* v1; void* v2; void* v3; int n; int t; const char *c1 = "A"; const char *c2 = "B"; const char *c3 = "C"; pfunz *f; cout<<"Inserisci la dimensione dei vettori: "; cin>>n; cout<<"Inserisci il tipo di dato:\n"; cout<<" 1) Unsigned Short\n" <<" 2) Float\n"; cin>>t; while(t!=1&&t!=2) { cout<<"ERRORE: Inserire valore corretto:\n"; cin>>t; } cout<<"Primo vettore:\n"; leggiVettore(v1,n,t,c1); stampaVettore(v1,n,t,c1); cout<<"Secondo Vettore:\n"; leggiVettore(v2,n,t,c2); stampaVettore(v2,n,t,c2); f=produciPfunz(n); v3=produciVettore(v1,v2,n,f,t,c3); stampaVettore(v3,n,t,c3); return 0; }
Grazie ancora sei un grande!


"TheBestNapoli":
funziona!!! GRANDE!!!
Calma, calma... vale sempre l'asserto di Knuth:
"Ho solo dimostrato che è corretto... mica ho l'ho provato a far funzionare!"

Quindi, fai delle prove e verifica che il programma vada correttamente.
Calma, calma... vale sempre l'asserto di Knuth:
"Ho solo dimostrato che è corretto... mica ho l'ho provato a far funzionare!"
ahahah

Inserisci la dimensione dei vettori: 4 Inserisci il tipo di dato: 1) Unsigned Short 2) Float 1 Primo vettore: Inserisci il 1o numero unsigned short: 5 Inserisci il 2o numero unsigned short: 3 Inserisci il 3o numero unsigned short: 8 Inserisci il 4o numero unsigned short: 4 Il vettore A di tipo unsigned short e': 5 3 8 4 Secondo Vettore: Inserisci il 1o numero unsigned short: 2 Inserisci il 2o numero unsigned short: 1 Inserisci il 3o numero unsigned short: 4 Inserisci il 4o numero unsigned short: 2 Il vettore B di tipo unsigned short e': 2 1 4 2 Il vettore C di tipo unsigned short e': 25 3 4096 2
le posizioni del vettore C vanno da 0 a 3 e quindi 0 e 2 sono pari e 1 e 3 sono dispari... dato che nelle posizioni pari si richiamava la funzione potenza e in quelle dispari la funzione divisione mi trovo

infatti:
$5^2=25$
$3-:1=3$
$8^4=4096$
$4-:2=2$
ho provato anche scegliendo float e fila tutto liscio

Grazie mille ancoraaa!!



