Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/04/2010, 21:20
bralmu
 
Fecha de Ingreso: diciembre-2009
Ubicación: European Union
Mensajes: 29
Antigüedad: 15 años
Puntos: 2
(Solucionado) Exception in thread "main" java.lang.StackOverflowError

Tengo un problema.

Resulta que tengo una función recursiva que a veces falla y a veces no. No lo he medido pero más o menos al anidarse más de 100 veces falla.

Simplificándolo mucho, tengo una matriz de una imagen y la recorro recursivamente para agrupar los píxeles por zonas. Pero cuando la imagen tiene zonas grandes me da la excepción

Cita:
protected boolean agrupar(int x, int y, int grupo){ // coordenadas X e Y y grupo que se le quiere asignar

if(matriz[x][y].grupo!=null){
return false; // si ya tiene un grupo asignado... no hacemos nada
}
else{
matriz[x][y].grupo=grupo; // si no tiene grupo, se lo asignamos
agrupar(x, y-1, grupo); // y repetimos recursivamente: vecino debajo
agrupar(x, y+1, grupo); // repetimos recursivamente: vecino arriba
agrupar(x-1, y, grupo); // repetimos recursivamente: vecino izquierdo
agrupar(x, y-1, grupo); // repetimos recursivamente: vecino derecho
return true;
}
Lo gracioso es que el código lo tenía escrito en C y funcionaba perfectamente pero lo al portarlo a Java me he encontrado esta sorpresa.
Estoy seguro de que no entra en bucle infinito, lo que pasa es que según con qué imágenes, se pueden anidar cientos de llamadas recursivas ¿hay alguna solución a esta limitación del StackOverflow?

Os voy a poner un ejemplo. Con esta imagen:

[url=http://www.subirimagenes.com/otros-exi-4400498.html]Ver Imagen: http://s3.subirimagenes.com:81/otros/previo/thump_4400498exi.jpg[/url]

si llamo a agrupar() empezando por un pixel del círculo azul, eso empieza a llamarse recursivamente decenas de veces hasta agrupar todos los píxeles del círculo azul, y termina sin problema. Pero si lo hago con la mancha naranja se hacen muchas más llamadas recursivas anidadas (lógico porque es más grande, hay más píxeles) y en mitad del proceso me da "Exception in thread "main" java.lang.StackOverflowError" cosa que en C no me pasaba (aguantaba miles de llamadas recursivas)

Última edición por bralmu; 23/04/2010 a las 07:26 Razón: ya se ha solucionado