|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[C++] Passaggio di un vector<int>
Ciao.
Ho dichiarato in un file, questa classe: Codice:
class Dns{ private: vector<int> proxy; vector<Provider> provider; //un'array di Provider (Provider è una struct definita in un altro file) map<string, vector<int> > mapper; public: Dns(); Dns(vector<int> , vector<Provider>); void Associations(int, int); void stampa_mapper(int []); }; Codice:
Dns::Dns(vector<int> newp, vector<Provider> newprov){ proxy=newp; provider=newprov; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
innanzitutto ti consiglio di ottimizzare passando i due vettori al costruttore come puntatore.
ricordo di aver guardato tempo fa il costruttore copia dei vector e non mi sembrava un gran che... secondo me il metodo migliore per caricare i tuoi vettori membri di classe è: Codice:
for (unsigned int i = 0; i < newp->size(); i++) proxy.push_back(newp[i]); ciao
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ah quindi proprio facendo un semplice ciclo. Io perché pensavo che con l'operatore = lo assegnava direttamente (come d'altronde poi ha fatto con vector<Provider>). Strano comunque questo comportamento. Grazie.
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Strano...in teoria dovrebbe funzionare...
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Giusto perchè, se provi questo codice che ho scritto al volo: Codice:
#include <iostream> #include <vector> using namespace std; class Test { public: Test(vector<int> v) { vect = v; }; void print() { for (int i = 0; i < vect.size(); i++) cout << vect[i] << endl; } private: vector<int> vect; }; int main() { vector<int> v; Test *test; v.push_back(1); v.push_back(3); v.push_back(5); test = new Test(v); test->print(); delete test; return 0; } EDIT: Ricorda una cosa: quando usi l'operatore 'push_back' su un oggetto vector che NON contiene puntatori ma oggetti/tipi, l'oggetto NON viene inserito copiandolo, ma costruendone un altro (quindi viene chiamato il costruttore della classe che stai inserendo). Puoi immaginare i problemi derivanti se usi classi astratte (polimorfismo)... Idem se usi l'operatore =. Te lo dico perchè vedo dal tuo codice che usi un vector<Provider> (ok che Provider è una struct, ma se un giorno volessi usare una classe, pensando ad un possibile code recycling...).
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 19-05-2007 alle 21:14. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per essere precisi viene usato il costruttore di copia...
Cioè il costruttore (se non è presente è implicito ed utilizza membro a membro sempre il rispettivo costruttore di copia): TuaClasse(const TuaClasse &) Quindi nel caso ci siano puntatori a memoria dinamica fra i membri spesso va ridefinito allocando nuova memoria dinamica per la copia creata, che va deallocata poi nel distruttore... Comunque il problema non credo sia di questo tipo, perché ce l'ha sul primo parametro, cioè quello relativo al vettore di interi, e il problema è strano per questo. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Infatti quello che volevo fare era passare entrambi i vector per riferimento, solo che per quanto riguarda il vector<int> da questo problema. Provando con un int* non ha problemi invece.
![]() |
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
![]() Quote:
Tra l'altro, il codice che ho postato (che fa la stessa cosa che vuole fare lui, che tra l'altro non è il massimo, visto che per lo meno bisogna passare il vector per riferimento, per non sprecare 3 volte memoria) funziona benissimo.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Sì ma comunque è strano: dai un'occhiata al codice che ho postato.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Guarda io nel main ho una cosa del genere:
Codice:
vector<Provider> provider; ... ... vector<int> proxies; ... ... for(i=0; i<8; ++i) proxies[i]=id_proxy; for(i=0; i<15; ++i){ Provider nuovo; nuovo.nome_provider="Alice" nuovo.peso=rand()%100; nuovo.id_provider=i; provider.push_back(nuovo); } Dns domain_name_server(proxies,provider); //creo l'oggetto così ![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prova con proxies.push_back(id_proxy);
Come dicevamo non fare un passaggio per indirizzo, ma fallo per riferimento: Dns::Dns(vector<int> &newp, vector<Provider> &newprov) |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Codice:
Dns *domain_name_server = new Dns(proxies, provider); ![]()
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perchè lo deve creare con new ?
![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Attenzione, errore trovato!!
![]() Codice:
for(i=0; i<8; ++i) proxies[i]=id_proxy; Semmai Codice:
for(i=0; i<8; i++) proxies.push_back(id_proxy);
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 20-05-2007 alle 16:56. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Non che sia neccessario per il corretto funzionamento, però, come dicevo prima, hai un maggiore controllo sull'uso della memoria.
Inoltre, non è questo il caso mi pare, però a volte costruire implicitamente l'oggetto mi ha portato strani malfunzionamenti.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Aspetta il passaggio è per riferimento, infatti il costruttore ora è definito così:
Codice:
Dns(vector<int>& , vector<Provider>& ); ![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ragazzi ora funziona!!!!!
![]() Il problema era proprio il fatto che usavo l'operatore [] invece che push_back. Grazie mille. ![]() |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
![]() Invece push_back alloca un nuovo spazio di memoria ed inserisce la variabile. Non a caso prima 'proxies' era NULL.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:16.