Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Cos'è la bolla dell'IA e perché se ne parla
Cos'è la bolla dell'IA e perché se ne parla
Si parla molto ultimamente di "bolla dell'intelligenza artificiale", ma non è sempre chiaro perché: l'IA è una tecnologia molto promettente e che ha già cambiato molte cose dentro e fuori le aziende, ma ci sono enormi aspettative che stanno gonfiando a dismisura i valori delle azioni e distorcendo il mercato. Il che, com'è facile intuire, può portare a una ripetizione della "bolla dotcom", e forse anche di quella dei mutui subprime. Vediamo perché
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile
BOOX Palma 2 Pro è l'ultima evoluzione della gamma Palma. Ma di cosa si tratta? In breve è un dispositivo e-ink da 6,13 pollici che sfida le convenzioni con un display Kaleido 3 a colori, supporto per stilo InkSense Plus, connettività 5G solo dati e alimentato dal sistema operativo Android 15. Con queste caratteristica si configura come qualcosa in più di un semplice e-reader
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2007, 18: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, 20: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, 21: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, 22: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, 22: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 22:14.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 09: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, 09: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, 10: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, 13: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, 13: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, 15: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, 15: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, 17: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, 17: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, 17: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 17:56.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2007, 17: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, 18: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, 18: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, 20: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


AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Fondazione Chips-IT, l'Italia alla riscossa nei chip. Il piano e la partnership EssilorLuxottica Fondazione Chips-IT, l'Italia alla riscossa nei ...
La Cina sotto pressione impone maniglie ...
OpenAI integra le app in ChatGPT per tra...
NVIDIA sarebbe pronta a tagliare la prod...
Prezzo minimo storico per iPhone 16 Pro:...
Riot Games scopre una falla nei BIOS che...
Beats in super offerta su Amazon: aurico...
Batterie elettriche, Samsung SDI e Stell...
Clivet presenta Fullness, la pompa di ca...
SpaceX lancerà 167 razzi spaziali...
Yakuza Kiwami 3 e Dark Ties protagonisti...
Privacy a rischio: ecco la VPN che regis...
SpaceX ha annunciato che un satellite St...
ASUSTOR presenta i nuovi NAS Lockerstor ...
Rivoluzione fotovoltaico: i pannelli non...
Jared Isaacman è ufficialmente il...
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: 16:59.


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