Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
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
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-07-2013, 11:48   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
[C++] Reference a oggetto di una classe sembra non essere valorizzato

Sto implementando questa classe:

Codice:
typedef Graph<GraphNode, GraphEdge> GraphType;

template <class graph_type, class node_type, class edge_type>
class DijkstraSearch
{
	public:
		
		typedef node_type Node;
		typedef edge_type Edge;
		typedef graph_type Graph;

	private:
		
		//the graph the algorithm is runned on
		const Graph& graph;
		
		//stores the closest node to compute in the next step
		int nextClosestNode;
		
		//Search Path Tree built by the algorithm
		std::vector<const Edge*> spt;
		
		//cost to reach each node from the source (the index inside the vector is the index of the node)
		std::vector<double> costToThisNode;

		//vector containing parent edges leading to the node connected to the spt but not added to the spt yet
		std::vector<const Edge*> searchFrontier;

		//source and target for the search
		int source;
		int target;
		
		void Search();

	public:

		DijkstraSearch(	const Graph& p_Graph,
						int p_Source,
						int p_Target = -1)
						:
						graph(p_Graph),
						spt(p_Graph.NumNodes()),						//init with the number of nodes in the graph
						searchFrontier(p_Graph.NumNodes()),			//init with the number of nodes in the graph
						costToThisNode(p_Graph.NumNodes()),			//init with the number of nodes in the graph
						source(p_Source),
						target(p_Target)		
		{
			//std::cout<<"p_Source: "<<p_Source<<std::endl;
			//std::cout<<"p_Target: "<<p_Target<<std::endl;
			//p_Graph.PrintGraph();
			std::cout<<"searchfrontier size: "<<p_Graph.NumNodes()<<std::endl;
			//std::cout<<"costToThisNode size: "<<costToThisNode.size()<<std::endl;
			Search();												//run the search when instantiated
		}

		std::list<int> GetPathToTarget()const;

};
Ma dentro al costruttore p_Graph sembra non essere valorizzato, infatti poi NumNodes() mi restituisce 0 ed i vari vettori non sono inizializzati e fanno crashare il programma.
Il main è questo:

Codice:
int _tmain(int argc, _TCHAR* argv[])
{
        //istantiate a graph
        GraphType *graph = new GraphType(true);

	//graph->PopulateRandom(5, 8);
	
        graph->CreateTestGraph();
	//graph->PrintGraph();

	//test dijkstra algorithm
	DijkstraSearch<GraphType, GraphNode, GraphEdge> *dijkstraSearch = new DijkstraSearch<GraphType, GraphNode, GraphEdge>( graph, 0, 2);	
	//print the resulting SPT
	dijkstraSearch->GetPathToTarget();

        delete graph;
	system("pause");

	return 0;
}
Il grafo che creo nel main è costruito bene, se decommmento la riga che fa PrintGraph mi stampa esattamente il grafo di test che voglio. E' un errore sulla variabile di tipo reference? Ho letto che occorre che siano inizializzate al momento della dichiarazione ma poi ho visto anche che lo si può fare nel costruttore (spero di non sbagliarmi).
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 14:57   #2
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Problema risolto.
La chiamata deve essere:

Codice:
DijkstraSearch<GraphType, GraphNode, GraphEdge> *dijkstraSearch = new DijkstraSearch<GraphType, GraphNode, GraphEdge>( *graph, 0, 2);
graph deve essere passato con il dereference.
(Per punirmi sto per guardare un video di 48 minuti solo sui puntatori).
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 17:21   #3
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Come l'altra volta...ma evitarli, questi puntatori, no??
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 19:53   #4
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Mi sono fatto il lavaggio del cervello. Spero di ricordarmene per le prossime volte .
Mi resta da approfondire i reference e come funzionano i template dal punto di vista dei puntatori.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 20:16   #5
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
come funzionano i template dal punto di vista dei puntatori.
Che intendi?
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 21:20   #6
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Ah è sempre riguardo la stessa cosa, non ho ancora digerito bene alcune cose e devo approfondire la teoria che c'è dietro.
Per esempio qui:

Codice:
template <class node_type, class edge_type>
int Graph<node_type, edge_type>::AddNode(node_type node)
{
    //trying to add a node that was already in the graph
    if ( node.Index() < (int)nodes.size())
    {
     ......
     ....
     ...
}
la chiamata è questa:
Codice:
GraphNode *node = new GraphNode(i);
AddNode(*node);
node è un puntatore ad un oggetto della mia classe, lo passo con il dereference perchè, immagino, voglio passare il valore di node alla funzione.
Poi la funzione lo usa senza * perchè ha il valore del nodo e non l'indirizzo di memoria (tant'è che come sintassi posso usare il punto '.' invece del '->' che risolve il puntatore come si farebbe con '(*node).' ).
Dunque devo desumere che node lì è passato per copia? Se io modifico node in realtà sto modificando solo il node che è nello scope della funzione?
Probabilmente sì (ma anche probabilmente no visto che non sono molto convinto di quello che ho detto) ma devo studiarmi un po' la teoria.

Lo stesso per gli iterator che mi pare vengano sempre considerati come puntatori ma nelle guide che ho seguito faceva solo un breve accenno a questa cosa e vorrei almeno rileggerla.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2013, 22:35   #7
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Ah è sempre riguardo la stessa cosa, non ho ancora digerito bene alcune cose e devo approfondire la teoria che c'è dietro.
Per esempio qui:

Codice:
template <class node_type, class edge_type>
int Graph<node_type, edge_type>::AddNode(node_type node)
{
    //trying to add a node that was already in the graph
    if ( node.Index() < (int)nodes.size())
    {
     ......
     ....
     ...
}
la chiamata è questa:
Codice:
GraphNode *node = new GraphNode(i);
AddNode(*node);
node è un puntatore ad un oggetto della mia classe, lo passo con il dereference perchè, immagino, voglio passare il valore di node alla funzione.
Poi la funzione lo usa senza * perchè ha il valore del nodo e non l'indirizzo di memoria (tant'è che come sintassi posso usare il punto '.' invece del '->' che risolve il puntatore come si farebbe con '(*node).' ).
Dunque devo desumere che node lì è passato per copia? Se io modifico node in realtà sto modificando solo il node che è nello scope della funzione?
Probabilmente sì (ma anche probabilmente no visto che non sono molto convinto di quello che ho detto) ma devo studiarmi un po' la teoria.

Lo stesso per gli iterator che mi pare vengano sempre considerati come puntatori ma nelle guide che ho seguito faceva solo un breve accenno a questa cosa e vorrei almeno rileggerla.
Sì, viene passato per copia perchè è la firma della funzione ricevente a deciderlo, cioè la lista parametri: la funzione riceve un node_type, quindi il nodo viene copiato. Se vuoi modificarlo, AddNode deve ricevere un node_type&.
E' logico che sia la funzione a decidere se poter modificare un oggetto passato come parametro, perchè se così non fosse una stessa funzione potrebbe essere usata con effetti diversi scegliendo da fuori se passare un reference o una copia (a parte che non c'è la sintassi per farlo, parlo giusto in linea teorica).
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2013, 15:19   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
Come l'altra volta...ma evitarli, questi puntatori, no??
L'uso dei reference non preclude l'uso dei puntatori.
Ci sono ottimi motivi per usare sia gli uni che gli altri.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2013, 15:27   #9
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da marco.r Guarda i messaggi
L'uso dei reference non preclude l'uso dei puntatori.
Ci sono ottimi motivi per usare sia gli uni che gli altri.
Uno dei pochi motivi per usare i puntatori nudi è come reference a oggetti già esistenti, quando viene scomodo dover per forza inizializzare una reference (o se non puoi usarle, come in un vector<T&> che non puoi fare, devi usare vector<T*>). Altrimenti meglio usare una delle nuove classi, o oggetti veri e propri definendo dei move constructor.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
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 ...
Numeri da record, Xiaomi distribuisce ol...
BitLocker accelerato via hardware: Micro...
Blue Origin prosegue lo sviluppo dei lan...
Moore Threads: nuove GPU 15 volte pi&ugr...
Steam diventa esclusivamente 64-bit: Val...
La Corte Suprema restituisce a Elon Musk...
X lancia Creator Studio su mobile: nuovi...
Dieci anni fa SpaceX fece atterrare per ...
POCO M8 e M8 Pro arriveranno nel 2026: e...
Caos Formula 1: il motore Mercedes &egra...
Tariffe nazionali per le chiamate e gli ...
Tassa chilometrica non solo per elettric...
FSR 4 su Radeon RX 5000, 6000 e 7000? Li...
Quanti alberi ci sono in Skyrim? In The ...
Pocket Max, la nuova console Mangmi punt...
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: 19:56.


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