Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
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 HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Stiga lancia i nuovi robot tagliaerba co...
Bullismo e cyberbullismo, Keenetic lanci...
Con AI Skills Checker Bitdefender mette ...
E-bike giapponese con 1.000 km di autono...
Un eVTOL con cui basta saper andare in b...
Dal mercato cinese al mondo: HONOR firma...
Sovranità digitale: l'UE sperimen...
Accesso alla memoria su Windows 11 solo ...
iPhone 18 Pro Max con batteria da oltre ...
Windows 11, cali di prestazioni sulle GP...
Un altro iPhone economico è in arrivo a ...
The Grand Tour 2026: ecco chi saranno i ...
Dai display alle soluzioni: Samsung tra ...
Ruba gli account Snapchat di quasi 60 do...
Svelata la Xiaomi YU7 GT: kit wide body ...
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:37.


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