Dúvida com escopo de variáveis

5 respostas
V

Seguinte galera, no meu programa eu tenho o seguinte método:

public void procuraBloco(int[][] matriz, int bloco, int row, int colum){
		for(row = 0; row < matriz.length; row++){
			for(colum = 0; colum < matriz[0].length; colum++)
				if(matriz[row][colum] == bloco)
					return;
		}
	}

Ele faz o seguinte: procura o inteiro “bloco” dentro da matriz “matriz”, setando as variáveis “row” e “colum” de acordo com a posição buscada na matriz. Ao achar o “bloco” ele simplesmente encerra o método, deixando assim os valores de “row” e “colum” serem a posição do “bloco” na matriz. Algo como:

int i = 0, j = 0; //“i” e “j” valem 0
objeto.procuraBloco(matriz, 5, i, j); //o método procuraBloco deveria alterar os valores de “i” e “j”
System.out.println(i +" " +j); //aqui os valores de “i” e “j” deveriam ser a posição do inteiro 5 na matriz

Porém, ao printar “i” e “j”, eles possuem ambos o valor 0.
Eu costumava fazer exatamente isso em C e funcionava perfeitamente. Alguem sabe me dizer se há algo errado com meu código, ou se Java trabalha diferente de C?
Obrigado desde já!!

5 Respostas

D

Bom pelo que eu entendi, vc quer que seu metodo retorne a posição do bloco, se for acho que uma das soluçoes seria:

public String procuraBloco(int[][] matriz, int bloco, int row, int colum){   
        boolean acho = false;
        for(row = 0; row < matriz.length; row++){   
            for(colum = 0; colum < matriz[0].length; colum++)   
                if(matriz[row][colum] == bloco)   
                    acho = true
   
        }
        if(acho = true)
               return row+" "+colum;
        else
               return "Não foi encontrado";
    }
Ai depois vc da um print assim:
System.out.println(procuraBloco(matriz,5,0,0));
ribclauport

Somente para constar, esta parte do codigo vai dar sempre true!

<blockquote>  if(acho = true)

return row+" "+colum;

else

return “Não foi encontrado”;

}

</blockquote>

Inclusive isso é uma das pegadinhas de certificação, onde o if tem uma atribuição, e desta forma sempre vai dar true, pois está com somente um sinal de “=”
o correto seria:

if(acho == true) //com dois sinais de iguais! return row+" "+colum; else return "Não foi encontrado"; }

Ou já que é uma variável do tipo boolean, e o if espera um boolean, poderia apenas usar a variável:

if(acho) //somente a variável é o suficiente! return row+" "+colum; else return "Não foi encontrado"; }

V

Opa, obrigado pelas respostas galera!
dinhohb, o que vc sugeriu provavelmente funciona, valeu pela dica, porém minha dúvida ainda permanece…
Eu usava essa técnica de “parâmetro de saída” em C e funcionava, agora em Java não está dando certo.
Um exemplo mais claro da minha dúvida:

public void alteraParametros(int x, int y){
   x = 1;
   y = 2;
 }
vamos supor no método Main temos as seguintes linhas:

int var1 = 0;

int var2 = 0;

objeto.alteraParametros(var1, var2);

System.out.println(var1 +" " +var2); //nesta parte, var1 deveria ser igual a 1, e var2 igual a 2. Porém elas continuam sendo 0.

Alguem sabe o porque o método alteraParametros nao consegue alterar as variáveis var1 e var2?

E

Em Java, C e C++ os parãmetros são passados sempre por valor. Por isso, o que você quer fazer não funciona.

Só que em C++ e C# você também pode passá-los por referência:

// C#
    public void alteraParametros(ref int x, ref int y){  
       x = 1;  
       y = 2;  
    }  
     // C++
public:
    void alteraParametros(int& x, int& y){  
       x = 1;  
       y = 2;  
    }

Como eu disse, as rosas são vermelhas, as violetas são azuis, C# é C# e Java é Java.

V

Aaaah sim, agora vi onde está meu erro… Obrigado entanglement, dúvida solucionada!

Criado 14 de maio de 2012
Ultima resposta 14 de mai. de 2012
Respostas 5
Participantes 4