Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22

    Modifica di variabili passate come parametri

    Ciao a tutti!!
    Ho un problema che mi sta bloccando da un sacco di tempo.

    Con questa linea di codice

    codice:
    for(int i=0; i<partitions.size(); i++)
    			global.addAll(globalPart(partitions.get(i), i, g, Smin, Smax));
    vado a elaborare le variabili Smin e Smax fornendo così un risultato che viene aggiunto nella variabile global.

    codice:
    public Vector <String> globalPart(String part, int k, Graph gr,Graph Smi, Graph Sma)
    	{
    		Graph Smin = Smi;
    		Graph Smax = Sma;
    		Graph g = gr;
    Quello che dovrebbe essere il corretto funzionamento è che ad ogni chiamata del metodo, dovrei utilizzare la stessa "versione" di Smin e Smax. Nella realtà ad ogni iterazione viene utilizzata la versione di Smin e di Smax elaborate nella chiamata precedente anche se non vengono modificate direttamente, ma ciò su cui avvengono i calcoli sono le variabili interne che memorizzano quelle passate per parametro.

    Qualcuno sa darmi una dritta? Non so veramente cosa pensare!!

    Grazie mille!!

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    In Java i parametri vengono passati solo per valore: il metodo quindi riceve una COPIA di tali parametri.
    Se il parametro è un oggetto verrà passata la copia del riferimento a quell'oggetto: se il metodo ne cambia lo stato questo verrà visto anche dal chiamante (l'oggetto "vero" è sempre uno solo). Nel caso di un tipo primitivo (int, double ecc) hai invece due variabili diverse, slegate tra di loro.

    Una soluzione è quella di passare un oggetto.. Oppure rendi quelle variabili non parametri ma attributi ma dipende da come stai strutturando tu la cosa.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    Infatti Smin e Smax sono oggetti. Quindi piuttosto che passare la copia originale (che è quella che voglio preservare) cosa dovrei passare?
    Mi verrebbe da fare, prima della chiamata del metodo, una creazione di variabili ausiliarie.
    Però facendo così il problema non mi si risolve...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    Nel cercare ancora ho trovato l'interfaccia Cloneable..è questa quindi la soluzione?

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da kiaBs
    Infatti Smin e Smax sono oggetti. Quindi piuttosto che passare la copia originale (che è quella che voglio preservare) cosa dovrei passare?
    Mi verrebbe da fare, prima della chiamata del metodo, una creazione di variabili ausiliarie.
    Però facendo così il problema non mi si risolve...
    Scusami, non avevo visto tutta la riga e da come ne parlavi ero convito fossero interi ^^'

    Puoi postare un altro po' di codice, per capire che tipo di operazioni fai su quegli oggetti?


    Originariamente inviato da kiaBs
    Nel cercare ancora ho trovato l'interfaccia Cloneable..è questa quindi la soluzione?
    Non credo.
    clone() restituisce una nuova istanza dell'oggetto chiamante (se implementato correttamente, ovviamente) ma avrai lo stesso problema.

    Provo ad abbozzare un esempietto:
    codice:
    public void foo() {
       X x = new X();
    
       x.qualcosa = 100;
       met1(x);
    
       System.out.println(x.qualcosa); // stampa 10
    
       x.qualcosa = 100;
       met2(x);
    
       System.out.println(x.qualcosa); // stampa 100
    }
    
    public void met1(X x) { 
       x.qualcosa = 10;
    }
    
    public void met2(X x) {
       x = new X();
       x.qualcosa = 10;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    22
    codice:
    public Vector <String> globalPart(String part, int k, Graph gr,Graph Smi, Graph Sma)
    	{
    		
    		Node aux;
    		String[] pieces;
    		Vector <String> global = new Vector <String>();
    		Graph Smin = Smi;
    		Graph Smax = Sma;
    		Graph g = gr;
    			
                   //System.out.println("Entro nel for che scorre partitions");
    			pieces = part.split("-");
    			for(int j=0; j<pieces.length; j++)
    			{	
    				aux = searchNode(pieces[j], Smax); //Questo metodo non modifica Smax, cerca dentro l'oggetto
    				
    				if(aux.getName() != "" && aux instanceof Input)
    				{
    					
    					if((isShared(aux.getOutFlow(), Smin))!= -1)
    					{
    						Smin.getFlows().get(isShared(aux.getOutFlow(), Smin)).getEndNode().setMark(0); //QUESTO METODO e' uno di quelli che modificano Smin
    						}
    				}
    			}
    			
    			if(Smin.equals(leftMarkedOK(Smin, Smin.getOutputs(), Smax)) == false )
    			{
    				Smin = leftMarkedOK(Smin, Smin.getOutputs(), Smax); //ANCHE QUESTO metodo modifica Smin
    				backTowardsPropagation(g, Smin, Smax); //ANCHE QUESTO metodo modifica
    			}
    			
                            Vector <String> localSmin = localDiagnosis(Smin, this); //Questo metodo non cambia Smin
    			
                            Node s;
    			
    			if(localSmin.isEmpty())
    				global.add(part);
    			else
    			{
    					for(int l=0; l<localSmin.size(); l++)
    					{
    						pieces = part.split("-");
    						if(k == 0)
    						{
    							for(int p=0; p<pieces.length; p++)
    								global.add(localSmin.get(l)+pieces[p]);
    						}
    						else
    							for(int p=0; p<pieces.length; p++)
    							{
    							/*s -> nodo cercato in Smax dato il nome;
    							 * e' un nodo di ingresso*/
    								s = searchNode(pieces[p],Smax);
    							/*
    							 * cerchiamo se e' condiviso in Smin, dati i suoi flussi di uscita
    							 * */
    								if(isShared(s.getOutFlow(), Smin) != -1)
    									global.add(localSmin.get(l)+pieces[p]);
    								else
    								{
    									if(!(global.contains(localSmin.get(l))))
    										global.add(localSmin.get(l));
    								}
    							}	
    			}
    		
    		}
    		
    		return global;
    	}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.