PDA

View Full Version : Questo programma mi crasha


ciottano
29-07-2008, 15:10
Salve a tutti.
Ho un problema con i vettori in C++.

Ho scritto questo programmino che riempie un vettore lungo n, lo ordina e ne mostra a schermo gli elementi.

Compila senza errori. Lanciandolo mi fa riempire il vettore ma poi mi crasha.

Se invece di dichiarare un vettore generico ne dichiaro uno di lunghezza prefissata va tutto liscio.

Uso Dev sotto WinXP.

Riporto sotto il codice.

Ciao,
G.#include <iostream>
#include <vector>

using namespace std;

//funzione per riecmpire il vettore
void carica(int n,vector<int> v){
//void carica(int n,int v[]){
int i;
int prova;
cout<<"inserire i voti"<<endl;
for(i=0;i<n;i++) {
cin>>prova;
v.push_back(prova);
}
}
//funzione per ordinare gli elementi del vettore
//void ordina(int n,int v[]){
void ordina(int n,vector<int> v){
int i,j;
int temp;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
if(v[i]>v[j]){
temp=v[i];
v[i]=v[j];
v[j]=temp;
}
}
}
int main(){
//int voti[10];
vector<int> voti;
int n;
int j;
int m;
float med;
float somma=0;
cout<<"inserire numero voti"<<endl;
cin>> n;
carica(n,voti);
ordina(n,voti);
for(j=0;j<n;j++) cout<<"voti "<<voti[j]<<endl;
//for(m=1;m<9;m++)
for(m=1;m<n-1;m++) somma=voti[m]+somma;
med=somma/(n-2);
cout<<"la media e' "<<med<<endl;
system("pause");
}

sottovento
29-07-2008, 16:38
Ciao,
innanzitutto cambia il titolo aggiungendo in [C++] in testa prima che ti scoprano (vabbe', c'e' scritto che e' un crash quindi puo' esser solo C/C++ :D )

Riguardo al crash: quando usi i vector (e li passi alle funzioni), non hai dato la possibilita' di MODIFICARLI all'interno della funzione! Il compilatore fara' una copia del vettore e lo passera' alle funzioni carica() e ordina().
Una volta completata l'esecuzione delle funzioni in oggetto, non ci sara' ovviamente una copia al contrario. Ecco che quindi accederai, sia in ordinamento sia in stampa, ad elementi che non esistono.

Ciao

ciottano
29-07-2008, 16:51
Ciao,
innanzitutto cambia il titolo aggiungendo in [C++] in testa prima che ti scoprano (vabbe', c'e' scritto che e' un crash quindi puo' esser solo C/C++ :D )

Riguardo al crash: quando usi i vector (e li passi alle funzioni), non hai dato la possibilita' di MODIFICARLI all'interno della funzione! Il compilatore fara' una copia del vettore e lo passera' alle funzioni carica() e ordina().
Una volta completata l'esecuzione delle funzioni in oggetto, non ci sara' ovviamente una copia al contrario. Ecco che quindi accederai, sia in ordinamento sia in stampa, ad elementi che non esistono.

Ciao

E per fare una copia in uscita da carica in modo da poterla passare ad ordina?
Cmq se non uso un vettore di dimensione indefinita ma lo dichiaro di lunghezza, chessò, 10, non ho problemi e tutto fila liscio. Quindi non credo che dipenda dal fatto che non mi ridia una copia in uscita dalle funzioni.

Grazie,
ciao,
G.

sottovento
29-07-2008, 17:08
E per fare una copia in uscita da carica in modo da poterla passare ad ordina?
Cmq se non uso un vettore di dimensione indefinita ma lo dichiaro di lunghezza, chessò, 10, non ho problemi e tutto fila liscio. Quindi non credo che dipenda dal fatto che non mi ridia una copia in uscita dalle funzioni.

Grazie,
ciao,
G.

No, non devi fare una copia in uscita. Semplicemente non devi fare nessuna copia, nemmeno in entrata. Oltretutto ci guadagni in efficienza ;)

Aggiungi un simbolo & (spero che si veda, non vorrei sia interpretato in maniera strana) alle dichiarazioni. Cosi' come li hai dichiarati, quei vettori (vector, intendo) sono solamente variabili di ingresso.

Diverso e' quando usi il vettore[] poiche' passi un indirizzo...

banryu79
29-07-2008, 17:32
In pratica sottovento ti sta suggerendo di passare come parametro la reference al vettore (operatore &): in questo modo, nel contesto della funzione verrà passato l'indirizzo del tuo vettore e le operazioni che quella funzione ci farà sopra modificheranno il tuo vettore.

Altrimenti, come ha già spiegato sottovento, il passaggio del parametro avviene per copia: all'interno della funzione verrà manipolata una copia del vettore, che esiste solo nello scope della funzione. All'esterno il tuo vettore risulterà immutato.

ciottano
29-07-2008, 17:36
Bene, grazie ad entrambi, ora ho capito il problema.

Provo e vi faccio sapere il risultato.

G.

ciottano
29-07-2008, 17:56
Ho risolto aggiungendo & come suggeritomi da sottovento.

Grazie ancora ad entrambi,
G.