[C++] norma di un vettore

cooper1
stavo cercando di implementare una funzione che restituisse la norma di un vettore con componenti prese da un file. a me sembra sia corretta dal punto di vista dell'implementazione ma se provo a farla funzionare mi restituisce zero, che è sbagliato :roll:
una piccola precisazione sul file: nella prima riga si ha la dimensione del vettore.il codice che ho scritto è:
per quanto riguarda la vera e propria implementazione:
double modulo(double *s, unsigned int dim){
	double x=0;
	for(int i=0; i<dim; i++){
		x=x+pow((s[i]),2);
	}
	return sqrt(x);
}


nel main invece ho fatto così:
ifstream ingresso;
	ingresso.open("risultati.txt");
	ingresso>>dim;
	double *v=new double[dim];
	g=modulo(v,dim);
	cout<<"la norma è: "<<g<<endl;
	ingresso.close();

grazie a chiunque mi risponderà

Risposte
vict85
Nel tuo codice manca la lettura del vettore.

cooper1
quindi dovrei fare così?
int i=0;
while(!ingresso.eof){
ingresso>>v[dim];
i++;
}

o basta semplicemente che metta [inline]ingresso>>v[dim][/inline]?
ad ogni modo grazie per la disponibilità!

vict85
Nessuno dei due. SI fa esattamente come faresti per l'inserimento da tastiera. Sono inoltre necessari dei test per controllare che tu non stia uscendo dai limiti dell'array. Per esempio [inline]v[dim][/inline] non è un elemento dell'array.

cooper1
ho corretto in questo modo:
int i=0;
	while(!ingresso.eof()){
		ingresso>>v[i];
		i++;
	}

inoltre il vettore v che prima avevo creato dinamicamente in modo errato dandogli una lunghezza prefissata l'ho dichiarato staticamente ([inline]double v[dim][/inline]). a questo punto, dandogli io una lunghezza nota (prima riga del fil che leggo), credo non servano più i controlli per il limite del vettore o sbaglio?

vict85
L'allocazione era corretta prima, o meglio era più corretta prima. Nota che non stai allocando staticamente, ma allocando "dinamicamente" nello stack. Questa operazione non è ammessa dallo standard C++ ma solo come estensione di GCC. Detto questo, nulla che viene letto da file o tastiera può essere ritenuto noto o sicuro. In particolare non puoi fidarti sul fatto che il numero fornito sia effettivamente uguale al numero di elementi. Preoccuparti di minimizzare il numero di test in un ciclo che si occupa di IO è piuttosto inutile.
Detto questo, cosa ti fa pensare che un array statico non necessiti di controlli?

cooper1
credevo che non ce ne fosse bisogno perchè sapendo per certo che la dimensione era quella, dato che il file è stato creato dai prof penso apposta, ero sicuro di non andare in zona di memoria non allocata.

apatriarca
Una piccola osservazione: non ha senso usare la funzione pow per calcolare il quadrato di un numero. pow((s[ i ]),2) è infatti più lungo da scrivere e più complicato di s[ i ]*s[ i ].. Esiste inoltre un operatore += in C++ che combina la somma e l'assegnamento. Avrei insomma riscritto la tua riga più interna al ciclo come segue:
// Era x=x+pow((s[i]),2);
x += s[i]*s[i];

Mi sembra decisamente più leggibile e chiaro come codice..

cooper1
lo terrò present per il futuro allora! grazie dei consigli. :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.