DOMANDA [JAVA]Puntatori e passaggio per riferimento

L

lock3r

Ospite
Ciao ragazzi, vi chiedo aiuto per un problema che ho e non so come risolverlo.
Sto sviluppando un sw che lavora con i thread, e dall'interno del metodo run devo costruire un albero n-ario che ho instanziato nel main. Quindi ho nel main una array list di alberi, e devo costruire ogni albero nell'array list dall'interno del 3d. Il problema è che i 3d non ritornano alcun valore, quindi devo passare l'oggetto per riferimento e non per copia.
Come posso fare? Potrei usare un puntatore? Mi date una mano per favore? Grazie mille!

Codice:
                public static void main(String[] args) throws IOException{		
		
		ArrayList<GenericTree> alberi = new ArrayList<GenericTree>(numero_casi);
		...
                ...
		StartThread s = new StartThread();
		s.run(alberi.get(i));
			
		}

Codice:
public class StartThread extends Thread{

public void run(GenericTree<Memorize> a){
....
}
 

Achan87

Nuovo Utente
15
2
Ciao,

sperando di aver capito il problema direi che hai fatto tanta confusione ma partiamo dall'inizio.

Con questa istruzione:

ArrayList<GenericTree> alberi = new ArrayList<GenericTree>(numero_casi);

hai creato un oggetto ArrayList che può contenere solo oggetti di tipo GenericTree (con la variabile numero_casi hai settato il numero iniziale di oggetti di tipo GenericTree che possono essere contenuti nell'ArrayList) ma l'ArrayList è ancora vuoto.

Quando esegui l'istruzione:

s.run(alberi.get(i))

in realtà la posizione i-esima dell'ArrayList 'alberi' è ancora vuota e va riempieta quindi la funzione get(i) ti restituirà un null.
Per risolvere il tuo problema dovresti eseguire la funzione seguente:

s.run(alberi)

in questo modo passerai il riferimento dell'ArrayList al thread, quest'ultimo si preoccuperà di creare un oggetto albero e di eseguire la:

alberi.add(alberoCreato).

Facendo così il tuo ArrayList verrà riempito.

Spero di essere stato abbastanza chiaro, se hai dubbi fammi sapere. :-)

Comunque in java i puntatori non si possono usare e tutti gli oggetti (bada solo gli oggetti e non i tipi primitivi) vengono passati sempre e solo per riferimento.
 
L

lock3r

Ospite
No, in realtà non sono così niubbo! Conosco il funzionamento dell'array list e dei template (generics in java?). Semplicemente ho eliminato le 200 righe di codice che separano l'inizializzazione dell'array list dall'avvio del 3d - avevo messo i puntini infatti! Ovviamente viene riempito prima di iniziare a lavorarci su... mea culpa, dovevo scrivercelo e mi sono spiegato malissimo:)
in ogni caso grazie della risposta!
Comunque... Per l'algoritmo che sto usando e per come è strutturato il sw ho assolutamente bisogno di passargli l'array list. Da qui il fatto che ho scritto

s.run(alber.get(i));

Il mio problema è questo: ho una serie di casi di studio, e per ognuno devo calcolare dei percorsi e memorizzarli in un albero (non mi addentro perché è un problema abbastanza difficile e non serve che te lo sto a spiegare tutto quanto!!), e la mia idea è di calcolarli in parallelo sfruttando i 3d: siccome ho bisogno di memorizzare i percorsi di ogni caso di studio in un albero.

Quindi ho bisogno di costruire l'albero all'interno del 3d per poi riusarlo al di fuori una volta che il 3d ha finito. Il fatto però è che i 3d non ritornano e quindi quello che non ho capito è se l'albero mi muore quando mi muore il 3d oppure se con la scrittura
s.run(alberi.get(i))
l'albero in posizione i-esima lo vado veramente a modificare oppure semplicemente mi muore alla fine del 3d.... spero di essere stato un po' più chiaro... grazie ragazzi!
Qui sì che ho un po' di confusione! :D
Se ancora non mi sono spiegato vi do direttamente il testo del progetto!
Grazie mille!

ps scusate se non sono stato preciso, non voglio far perdere tempo a nessuno, è solo che spiegarsi bene su un forum è molto difficile. Grazie ancora di cuore

---------- Post added at 03:19 ---------- Previous post was at 01:37 ----------

Yeah, studiando un pochino stanotte e con qualche piccolo test sono riuscito a risolvere. Grazie ancora!
 
Ultima modifica da un moderatore:

Achan87

Nuovo Utente
15
2
Guarda non mi è chiara solo una cosa: tu l'albero lo crei col thread? ovvero è il thread che lo genera dalla radice fino hai nodi foglia oppure il thread parte già da un nodo radice (che gli passi tramite alberi.get(i)).

Ti spiego:
1)se l'albero viene generato tutto dal thread allora devi fare s.run(alberi) e nel thread fare alberi.add(NuovoAlberoGenerato) in questo modo il riferimento (o puntatore) del nuovo albero generato viene passato all'ArrayList

2)se nell'ArrayList alla posizione i-esima hai già la radice di un albero o parte di un albero da estendere allora puoi fare s.run(alberi.get(i)) e nel thhread continuare ad estendere il tuo albero. In questo caso quando il thread termina comunque il tuo albero sarà stato esteso e non avrai perso nulla.
 
L

lock3r

Ospite
Yess, faccio così, gli passo la radice e il resto lo fa il 3d, e facendo un test in piccolo ho verificato che funziona. Grazie ancora :)
 
L

lock3r

Ospite
Ciao ancora a tutti ragazzi, ho un'altra domanda e ve la lascio qui senza aprire una nuova discussione. Praticamente sto ancora lavorando al progetto di cui sopra, provo a spiegarvelo bene così mi capite e magari mi potete aiutare.
Il testo completo del problema da risolvere potete trovarlo qui, problema C.
Comunque, ho un piano bidimensionale con 1<N<=20 carrucole, fra le quali almeno una è etichettata come START e almeno una è etichettata come END. Devo trovare il percorso più breve per collegare tramite una corda la carrucola START a quella END, rispettando alcuni limiti, come ad esempio che la distanza fra due carrucole deve essere minore di un valore D che viene dato dall'utente affinché possano essere collegate. (date una occhiata all'immagine qua sotto)...
Visualizza allegato 25048

Il prof inoltre mi ha chiesto amenità varie fra cui una interfaccia grafica etc, il tutto in java.

Ora, l'idea che ho avuto per risolvere con stile il problema ma soprattutto ricavare qualcosa di utile per me e il mio futuro è di usare i 3d; il percorso come scrivevo qualche post fa lo memorizzo tramite un albero di ricerca n-ario.
Praticamente, una volta fatte delle operazioni preliminari (tipo leggere il file col problema, istanziare gli oggetti necessari etc) chiamo un 3d che partendo dalla carrucola START, trova tutte le carrucole a cui può connettersi, calcola la distanza per ogni carrucola a cui può connettersi, crea un nodo dell'albero relativo a quella carrucola, e per ogni nodo chiama un altro 3d che faccia la stessa cosa su quel nodo. Solo che ho capito tardi di dover sincronizzare il tutto, e non ho la minima idea di come fare. Cioé, ogni 3d padre dovrebbe aspettare che TUTTI i 3d figli abbiano finito il loro lavoro prima di terminare, e gli stessi 3d figli dovrebbero essere come minimo sincronizzati fra loro e con i loro figli, perché ognuno di loro DEVE lavorare sull'albero e temo di incontrare problemi di deadlock o starvation, ma soprattutto non devono fare ca*ate.
Avevo pensato di usare una coda, ma temo sia maledettamente scomodo, e invece synchronized non mi ispira, ho letto un sacco di commenti poco entusiasti su questa KW.
Per cercare di risolvere ho rifatto il problema in piccolo, ma non ho veramente capito come fare a sincronizzarli.
Avete qualche idea su come fare?
Grazie a tutti, ciao!

EDIT: Mi sono reso conto solo ora che sostanzialmente serve una coda First In Last Out.... qualche idea? Tyall
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!