Buonasera, sto scrivendo questo codice per comprendere l'uso dell'overloading di funzione, in pratica devo scrivere tre funzioni con lo stesso nome, "modulo", di modo che la prima calcoli il modulo quando inserisco da tastiera un numero, la seconda quello per un vettore di due componenti (inserendo da tastiera due numeri), e la terza invece deve calcolare il modulo di un vettore a molte componenti, estraendo questi componenti da un file (che chiamo dati.dat, nella prima riga contiene il numero 100 che indica il numero degli elementi che seguono nelle righe successive e che devono essere considerati come componenti).
Ora, purtroppo io non so se mi sia completamente chiara la modalità di utilizzo dell'overloading, e il problema era appostato dietro l'angolo: stavo scrivendo questo programma in remoto via ssh, e (dopo varie peripezie) pareva fare il suo dovere, allora lo ho copiato sul mio pc via scp e ho controllato se era tutto ok... Non lo era affatto! Le prime due funzioni lavorano bene, invece se avvio la terza si arresta il programma visualizzando questo errore:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Annullato (core dump creato)
Qual è lo sbaglio? E come è possibile che in remoto funzioni e invece direttamente qui no?
Vi posto i codici.
Questo è il main:
#include"includes.h"
double modulo(double a);
double modulo(double a, double b);
double modulo(double *a, int L);
int main(){
int type, N;
double x, y;
cout << "\nPer valutare il modulo premi:\n1 per il modulo di un numero;\n2 per il modulo di un vettore a due componenti;\n3 per il modulo di un vettore a più componenti.\n" << endl;
cin >> type;
if(type==1){
cout << "\nDigita il numero di cui vuoi sapere il modulo, poi premi \"Invio\".\n" << endl;
cin >> x;
cout << "\nx=" << x << endl;
cout << "|x|=" << modulo(x) << endl << endl;
} else if(type==2){
cout << "\nDigita le due componenti del vettore separate da uno spazio, poi premi \"Invio\".\n" << endl;
cin >> x >> y;
cout << "\nx=" << x << endl << "y=" << y << endl;
cout << "|(x,y)|=" << modulo(x,y) << endl << endl;
} else if(type==3){
cout << "\nSi considerano le componenti del vettore in ingresso da dati.dat.\n" << endl;
double *x = new double[N];
ifstream inData;
inData.open("dati.dat");
inData >> N;
for(int i=0; i<N; i++){
inData >> x[i];
}
inData.close();
cout << "|*v|=" << modulo(x,N) << endl << endl;
} else {
cout << "\nIl carattere digitato non è valido. Programma terminato.\n" << endl;
return 1;
}
return 0;
}
e questo invece è il file includes.h (inserito come intestazione nel codice precedente) che contiene dichiarazioni varie e le funzioni stesse:
#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
double absVal;
double modulo(double a){
return absVal=abs(a);
}
double modulo(double a, double b){
return absVal=sqrt(pow(a,2)+pow(b,2));
}
double modulo(double *a, int L){
double sum=0;
for(int i=0; i<L; i++){
sum=sum+pow(a[i],2);
}
delete[] a;
return absVal=sqrt(sum);
}
Mi sarebbe di grande aiuto ricevere un giudizio e ben vengano consigli per migliorare una cosa di questo tipo.