[RISOLTO] Cosa sbaglio con la classe vector? (C++)
Sto dando un'occhiata alla classe vector: sembra possa essermi molto utile. Ho cominciato a scrivere queste righe di codice ma sull'array non riesco a caricare nulla.
Posto:
Quella che viene stampato è un riga di 5 zeri, nonostante il file "dati.txt" contenga una riga di 6 interi.
?!
Grazie per la pazienza!
Posto:
#include <iostream> #include <fstream> #include <vector> void loadVector (std::vector<int> ); void printVector (std::vector<int> ); int main(){ std::Vector<int> v(5); //dichiaro un array "lungo 5"; loadVector(v); //carico vettore da file già stabilito printVector(v); //stampo array } void loadVector(std::vector<int> vett) { std::ifstream ingresso; int dato; int i = 0; ingresso.open("dati.txt"); //"dati.txt" e' presente nella stessa //cartella dell'eseguibile ingresso >> dato; while ( !ingresso.eof() ){ vett[i] = dato; i++; ingresso >> dato; } ingresso.close(); } void printVector(std::vector<int> vett){ for(int j = 0; j < vett.size(); j++) std::cout << vett[j] << " "; std::cout << std::endl; }
Quella che viene stampato è un riga di 5 zeri, nonostante il file "dati.txt" contenga una riga di 6 interi.
?!
Grazie per la pazienza!
Risposte
Nella funzione "loadVector()" passi "v" per valore, quindi viene copiato dentro quella funzione, e la variabile del chiamante (main()) non viene modificata. È esattamente quello che succede con i tipi primitivi, come int:
Quindi la funzione "loadVector()" legge effettivamente i valori dal file, però li copia in un vettore che è una variabile locale della funzione "loadVector()", e il vettore del main() non viene modificato.
Potresti passare il vettore come riferimento (funzionerebbe anche passandolo come puntatore, ma per riferimento è più sicuro):
Oppure puoi semplicemente restituire un vettore, come faresti con un intero:
void f(int b) { // Modifica "b", variabile locale di "f()". b = 5; } int main() { int a = 4; // Il valore di "a" viene copiato dentro la variabile locale "b" di "f()". // La variabile "a" non viene modificata. f(a); std::cout << a << '\n'; // Stampa 4, non 5. }
Quindi la funzione "loadVector()" legge effettivamente i valori dal file, però li copia in un vettore che è una variabile locale della funzione "loadVector()", e il vettore del main() non viene modificato.
Potresti passare il vettore come riferimento (funzionerebbe anche passandolo come puntatore, ma per riferimento è più sicuro):
void loadVector(std::vector<int> & v) { // Modifica "v". // "v" è un riferimento ad una variabile passato dal chiamante. } int main() { std::vector<int> v; // Passa alla funzione un riferimento a "v". Tutte le modifiche verranno // fatte sulla variabile "v" del main(). loadVector(v); }
Oppure puoi semplicemente restituire un vettore, come faresti con un intero:
std::vector<int> loadVector() { std::vector<int> v; // "v" è una variabile locale a questa funzione. // Modifica "v". // Restituisce questa variabile al chiamante. return v; } int main() { std::vector<int> v = loadVector(); loadVector(v); }
"claudio86":
Nella funzione "loadVector()" passi "v" per valore, quindi viene copiato dentro quella funzione, e la variabile del chiamante (main()) non viene modificata. È esattamente quello che succede con i tipi primitivi, come int.
Questo non mi era per nulla chiaro. Grazie!