Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media
Intel ha introdotto le CPU Core Ultra 200S "non K" a inizio 2025. I nuovi modelli stanno arrivando sul mercato e abbiamo avuto l'opportunità di provare le soluzioni Core Ultra 5 235 e Core Ultra 5 225F, confrontandole con il Core i5-14400F di precedente generazione. Come si comportano i processori Arrow Lake per la massa? Scopriamolo insieme.
Roborock Saros Z70: un braccio meccanico per fare ordine in casa
Roborock Saros Z70: un braccio meccanico per fare ordine in casa
Dotato di tutte le ultime innovazioni in tema di aspirazione della polvere e pulizia dei pavimenti di casa, Roborock Saros Z70 integra un braccio meccanico che promette di rendere più efficiente la pulizia di casa spostando oggetti presenti sul pavimento e riordinandoli. Una idea bella e pratica, ma che all'atto pratico è pressoché inutilizzabile e dalle ricadute nulle
I nuovi notebook Acer al debutto al Computex 2025
I nuovi notebook Acer al debutto al Computex 2025
Al Computex 2025 di Taipei Acer mostra una completa gamma di soluzioni notebook delle famiglie Swift, Aspire, Predator e Nitro pensati per gli utenti consumer oltre che per coloro che ricercano elevata potenza di elaborazione, per lavorare o per giocare. In base al modello troviamo piattaforme Intel, AMD oppure Qualcomm anche in abbinamento alle nuove GPU NVIDIA GeForce RTX 5000
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2007, 17:36   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
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 []);
};
Il corpo del costruttore con argomenti è:

Codice:
Dns::Dns(vector<int> newp, vector<Provider> newprov){
   proxy=newp;
   provider=newprov;
}
Ora se dal main istanzio un oggetto di tipo Dns con tale costruttore, succede che provider viene correttamente copiato da newprov mentre proxy no. Infatti se vado a fare un debugging con gdb mi accorgo che provider contiene correttamente tutti i campi che ho inizializzato nel main, mentre proxy (nonostante sia correttamente inizializzato con tutti i valori nel main) non ha nessun campo inizializzato (anzi l'indirizzo di memoria è proprio NULL). Non capisco perché non riesce a passarglielo correttamente. Avete idee? Grazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 19:15   #2
vizzz
Senior Member
 
L'Avatar di vizzz
 
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]);
stessa cosa per l'altro vector.
ciao
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
vizzz è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 20:52   #3
Manugal
Senior Member
 
L'Avatar di Manugal
 
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.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 21:02   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Strano...in teoria dovrebbe funzionare...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 21:04   #5
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da Manugal Guarda i messaggi
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 []);
};
Il corpo del costruttore con argomenti è:

Codice:
Dns::Dns(vector<int> newp, vector<Provider> newprov){
   proxy=newp;
   provider=newprov;
}
Ora se dal main istanzio un oggetto di tipo Dns con tale costruttore, succede che provider viene correttamente copiato da newprov mentre proxy no. Infatti se vado a fare un debugging con gdb mi accorgo che provider contiene correttamente tutti i campi che ho inizializzato nel main, mentre proxy (nonostante sia correttamente inizializzato con tutti i valori nel main) non ha nessun campo inizializzato (anzi l'indirizzo di memoria è proprio NULL). Non capisco perché non riesce a passarglielo correttamente. Avete idee? Grazie.
A parte le varie ottimizzazioni possibili, come costruisci la classe Dns?
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;
}
il tutto funziona.

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.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 08:35   #6
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 08:37   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da vizzz Guarda i messaggi
innanzitutto ti consiglio di ottimizzare passando i due vettori al costruttore come puntatore.
Semmai come riferimento...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 09:25   #8
Manugal
Senior Member
 
L'Avatar di Manugal
 
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.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 12:05   #9
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da cionci Guarda i messaggi
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...
Esatto

Quote:
Originariamente inviato da cionci Guarda i messaggi
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.
No infatti, dicevo quella cosa per sua informazione, nel caso volesse usare un vector contenente classi (magari con classi astratte).
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
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 12:06   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da Manugal Guarda i messaggi
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.
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
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 14:42   #11
Manugal
Senior Member
 
L'Avatar di Manugal
 
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ì
Avevo provato a leggere tutti gli elementi di proxies[i] nel main e venivano inizializzati come volevo io. Ma una volta che li passo niente.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 14:49   #12
cionci
Senior Member
 
L'Avatar di cionci
 
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)
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 16:46   #13
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da Manugal Guarda i messaggi
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ì
Avevo provato a leggere tutti gli elementi di proxies[i] nel main e venivano inizializzati come volevo io. Ma una volta che li passo niente.
Devi creare l'oggetto Dns con new...

Codice:
Dns *domain_name_server = new Dns(proxies, provider);
In più, passa i parametri al costruttore "by reference", altrimenti sprechi 2 volte memoria, come ti ha fatto vedere cionci
__________________

- 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
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 16:47   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Perchè lo deve creare con new ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 16:52   #15
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
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);
Se proprio vuoi, puoi continuare a non usare new per creare l'oggetto e farlo implicitamente (io preferisco new e relativa delete, così libero memoria subito, quando non ho più bisogno dell'oggetto).
__________________

- 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.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 16:54   #16
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da cionci Guarda i messaggi
Perchè lo deve creare con new ?
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
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 17:09   #17
Manugal
Senior Member
 
L'Avatar di Manugal
 
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>& );
Quindi chiamando il costruttore in quel modo è passato per riferimento. Per quanto riguarda l'inserimento dei valori anch'io stavo pensando fosse quello che dicevi tu (cioè fare push_back) solo che visto che nel main me lo inzializzava correttamente allora non ci ho neanche provato. Per quanto riguarda l'inizializzazione con new in effetti hai ragione sul fatto che sei più libero nel gestire la memoria, ma a me quelle strutture che creo serviranno per tutto il programma (cioè non ci sono punti intermedi dove potrei disallocarle). In ogni caso credo che userò lo stesso new e delete.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 17:20   #18
Manugal
Senior Member
 
L'Avatar di Manugal
 
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.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 19:45   #19
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da Manugal Guarda i messaggi
Ragazzi ora funziona!!!!!

Il problema era proprio il fatto che usavo l'operatore [] invece che push_back. Grazie mille.
Il problema sorgeva perché tu assegnavi dei valori ad un vector di dimensione 0 (appena lo crei/definisci contiene 0 elementi, a meno di non specificare qualcosa nel costruttore), quindi assegnando valori con [] semplicemente l'operazione falliva (il programma non si blocca o altro, semplicemente l'operazione viene ignorata dalla classe vector, e viene generato un errore che puoi "catchare").
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
-fidel- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU ...
Roborock Saros Z70: un braccio meccanico per fare ordine in casa Roborock Saros Z70: un braccio meccanico per far...
I nuovi notebook Acer al debutto al Computex 2025 I nuovi notebook Acer al debutto al Computex 202...
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom Nutanix .NEXT: così l'azienda vuole aiuta...
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo! HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha...
Google I/O 2025, inizia ufficialmente l'...
BMW ha completato il primo test su strad...
Ecco come i big usano la piattaforma IA ...
Pulsee Luce e Gas lancia "Casa Futu...
Polestar semplifica la ricarica in Itali...
Riscaldare meno, risparmiare di pi&ugrav...
BLUETTI Apex 300: la nuova power station...
LG xboom Buds by will.i.am: gli auricola...
Sapphire Phantomlink: il produttore cine...
Tornano gli incentivi auto 2025, e quest...
Nikola, i camion a idrogeno finiscono al...
Space Cadet Pinball: il gioco di WindowX...
Nuovo blackout in Spagna: reti mobili e ...
L'Intelligenza Artificiale fa piazza pul...
Memoria d'acciaio! Lexar presenta le nuo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www1v