Overloading di funzione

di il
7 risposte

Overloading di funzione

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.

7 Risposte

  • Re: Overloading di funzione

    Non si inseriscono più domande nello stesso thread ... si fa solo confusione ...
  • Re: Overloading di funzione

    double *x = new double[N];
       ifstream inData;
       inData.open("dati.dat");
       inData >> N;
    Controlla sta parte. Secondo te cosa c'è che non va?
    Si risolve solo la prima per il momento. Il resto puoi aprire un altro thread.
  • Re: Overloading di funzione

    Aggiungo che quando si fanno errori con le allocazioni di memoria e/o i puntatori, il risultato è "imprevedibile".

    Ovvero, in certe occasioni può sembrare funzionare (i casi peggiori) e in altre hai un errore a runtime (la situazione migliore).

    Infine, ti suggerisco di non scrivere codice all'interno dei file include ...
  • Re: Overloading di funzione

    Chiedo scusa, non sapevo la questione delle domande multiple, ho sistemato il post!

    Accidenti, skynet, ho capito! Dovevo prima assegnare a N la dimensione del vettore e poi dichiararlo! Grazie!

    oregon, li ho inseriti in questo modo perché fa parte dell'esercizio che sto svolgendo... Ma se posso chiedere come mai lo sconsigli?

    Comunque mi è rimasto il dubbio per il fatto che in remoto il programma funzionava bene, invece una volta copiato sul mio computer ha iniziato a dare quel problema! Avete idea del perché?


    Grazie mille per l'aiuto, e scusatemi, sto imparando!
  • Re: Overloading di funzione

    Gywhard ha scritto:


    oregon, li ho inseriti in questo modo perché fa parte dell'esercizio che sto svolgendo... Ma se posso chiedere come mai lo sconsigli?
    Perché i file include non devono contenere codice nè variabili.

    Se vuoi dividere il codice in moduli, utilizza più file .c
    Comunque mi è rimasto il dubbio per il fatto che in remoto il programma funzionava bene, invece una volta copiato sul mio computer ha iniziato a dare quel problema! Avete idea del perché?
    Mi pare di avertelo detto nella mia risposta.
    Grazie mille per l'aiuto, e scusatemi, sto imparando!
    Prego, di nulla ... ma leggi attentamente le risposte ...
  • Re: Overloading di funzione

    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);
    }
    Ti consiglio di togliere il delete e ti spostarlo nel main. La funzione modulo non centra con l'allocazione della memoria e con la sua deallocazione.
  • Re: Overloading di funzione

    Scusa oregon, pensavo intendessi "a volte" come con diversi programmi e non come con diversi calcolatori.

    Comunque ho seguito i consigli, ho creato un nuovo file functions.C in cui ho messo le mie funzioni e ho spostato il delete nel main, in effetti è logico visto che il vettore l'ho allocato lì!

    Grazie mille per le delucidazioni!
Devi accedere o registrarti per scrivere nel forum
7 risposte