Foros del Web » Programación para mayores de 30 ;) » Java »

Situacion extañisima (poblema de codigo)

Estas en el tema de Situacion extañisima (poblema de codigo) en el foro de Java en Foros del Web. Hola, soy Abraham soy novatillo en Java. Bueno os pongo en situacion, tengo un "tablero" con cuadriculas, y debo hallar el camino mas corto de ...
  #1 (permalink)  
Antiguo 04/07/2009, 06:24
 
Fecha de Ingreso: junio-2007
Mensajes: 41
Antigüedad: 16 años, 11 meses
Puntos: 0
Situacion extañisima (poblema de codigo)

Hola, soy Abraham soy novatillo en Java.

Bueno os pongo en situacion, tengo un "tablero" con cuadriculas, y debo hallar el camino mas corto de una cuadricula, eso es facil y lo hice, el problema es el siguiente

en el codigo que os pondre al final, tengo un bucle while, que realiza el algoritmo para buscar el camino mas corto y va introduciendo las cuadriculas por las que debe ir en un array de cuadriculas, hasta ahi bien, todo correcto, pero cuando puse los tipicos imprimir en pantalla para ver los resultados, veo que dentro del bucle, el array recoge bien todo, pero nada mas salir del bucle y dentro del mismo metodo, el array solo ha recogido en todos sus espacios la cuadricula destino,
No veo por donde puede, fallar, puede que sea alguna estupidez mia, o algo tipo que el ambito del array es solo para dentro del bucle o algo asi que tenga java, ya os comente que soy novatillo y todavia no me aclaro mucho con el tema arrays.

En resumen, que el println de dentro del bucle sale todo bien, y justo el println despues del bucle solo sale la cuadricula de destino en todas las posiciones salvo la trayectoria[0]

el codigo de la clase es este

public class Movimiento
{
Cuadricula origen;
Cuadricula destino;
Cuadricula trayectoria[]=new Cuadricula[20];



Movimiento(Cuadricula o,Cuadricula d)
{
origen=o;
destino=d;
}

//Calculara la trayectoria para ir de origen a destino
void CalcularTrayectoria(Cuadricula o, Cuadricula d)
{
int i=0;
int j=0;
trayectoria[i]=o;
Cuadricula pos=new Cuadricula(o.x,o.y);
while (pos.x!=d.x || pos.y!=d.y)
{
if(pos.x!=d.x)
{
if(pos.x>d.x)
pos.x--;
else
pos.x++;
}

if(pos.y!=d.y)
{
if(pos.y>d.y)
pos.y--;
else
pos.y++;
}

i++;
trayectoria[i]=pos;
System.out.println("trayectoria["+i+"]="+trayectoria[i].x+"-"+trayectoria[i].y);
}

for(j=0;j<=i;j++)
System.out.println("trayectoria["+j+"]="+trayectoria[j].x+"-"+trayectoria[j].y);

}


Un saludo y gracias de antemano
  #2 (permalink)  
Antiguo 04/07/2009, 18:02
Avatar de JairLizcano  
Fecha de Ingreso: junio-2008
Ubicación: Santander, Colombia
Mensajes: 608
Antigüedad: 15 años, 10 meses
Puntos: 53
Respuesta: Situacion extañisima (poblema de codigo)

Mi punto: si es un tablero, ¿por qué no lo trabajas como una matriz bidimensional?.

Ejemplo: int tablero [][] = new int [filas][columnas].

No vi esa parte de código si la tienes en otra clase.
  #3 (permalink)  
Antiguo 05/07/2009, 05:09
 
Fecha de Ingreso: junio-2007
Mensajes: 41
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Situacion extañisima (poblema de codigo)

Bueno esque esto es parte de la aplicacion, ya trabajo el panel como una matriz bidimensional de objetos "Cuadriculas" pero los objetos cuadriculas tienen atributos y demas y tal y como lo tengo modelado deben instanciarse las cuadriculas por separado.
El problema es solo de este codigo, lo demas funciona.

Gracias de todas formas
  #4 (permalink)  
Antiguo 05/07/2009, 10:59
Avatar de ezefarina  
Fecha de Ingreso: junio-2009
Mensajes: 91
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Situacion extañisima (poblema de codigo)

Hola Abell. Mirá, probá lo siguiente, si no me equivoco es la solución a tu problema.

public class Movimiento
{
Cuadricula origen;
Cuadricula destino;
Cuadricula trayectoria[]=new Cuadricula[20];



Movimiento(Cuadricula o,Cuadricula d)
{
origen=o;
destino=d;
}

//Calculara la trayectoria para ir de origen a destino
void CalcularTrayectoria(Cuadricula o, Cuadricula d)
{
int i=0;
int j=0;
trayectoria[i]=o;
Cuadricula pos=new Cuadricula(o.x,o.y);
while (pos.x!=d.x || pos.y!=d.y)
{
if(pos.x!=d.x)
{
if(pos.x>d.x)
pos.x--;
else
pos.x++;
}

if(pos.y!=d.y)
{
if(pos.y>d.y)
pos.y--;
else
pos.y++;
}

i++;
trayectoria[i]=new Cuadricula(pos.x, pos.y);
System.out.println("trayectoria["+i+"]="+trayectoria[i].x+"-"+trayectoria[i].y);
}

for(j=0;j<=i;j++)
System.out.println("trayectoria["+j+"]="+trayectoria[j].x+"-"+trayectoria[j].y);

}

La línea que está en negrita es la que modifiqué. Cuando trabajas con este tipo de referencias a objetos, tenés que asegurarte que luego el objeto especificado no sea modificado. En este caso, vos añadis al array una instancia de Cuadricula, cuyos valores se van modificando a lo largo del while. Entonces, lo que hago yo en esta modificación, es poner un nuevo objeto en el array, con los datos que querés poner. El problema, mas especificamente, es que un array, no es mas que una lista de direcciones de memoria. La variable "pos" es una única variable, por ende, con una única posición de memoria propia. Entonces, cada vez que modificas el objeto, la posición sigue siendo la misma, por ende, el array está repleto, con la misma posición de memoria de pos. Y es por esto, que siempre toma el ultimo valor que tuvo, en otras palabras, la ultima modificación que está contenida en esa posición de memoria. Añadiendo objetos nuevos, cada uno de ellos tendrá su memoria propia, y de esta manera, no perderás los valores previos.. Me explico? creo que me enrede un poco en la explicación, pero es por esto que te explico que no te está funcionando. ;) Espero te sirva
  #5 (permalink)  
Antiguo 05/07/2009, 11:23
 
Fecha de Ingreso: junio-2007
Mensajes: 41
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Situacion extañisima (poblema de codigo)

Lo probaré, pero es verdad, sobreescribira cada vez, y lo ke hacia no era crear una copia de pos, si no una llamada a este objeto.
tienes toda la razon.

Muchas gracias
  #6 (permalink)  
Antiguo 05/07/2009, 11:34
Avatar de ezefarina  
Fecha de Ingreso: junio-2009
Mensajes: 91
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Situacion extañisima (poblema de codigo)

Por nada !! Suerte ;)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:59.