Ao executar meu programa, ele dá segmentation fault em algum momento da função pixelsRegiao e, aparente mente, ele só faz chamadas recursivas para detectar três vizinhos de um pixel, pensei que ele pudesse estar em algum looping infinito, mas já mandei dar printfs na minha base e eles estão aparecendo. Não sei o que pode estar acontecendo...
Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Hmmm. Isto pode estar relacionado com o problema que o Fábio descreveu no tópico
Recursão causando stack overflow
Uma das condições da base da recursão é o pixel já ter sido vistado, há um campo para isto na struct PixelRGB.
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Então, o problema é que eu já adicionei essa condição na base da minha recursão. Vou tentar ver se a minha imagem tem realmente os pixels salvos, por que ele está fazendo tantas chamadas recursivas que ele acaba não conseguindo nem chegar a inserir o pixel na lista de pixels e, consequentemente, não consegue alterar seu status de visitado para true.
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Então, o problema é que eu já adicionei essa condição na base da minha recursão.
Ok.
A base são condições no início da função, certo?
Bem, o que você pode fazer é, assim que passou pela base:
- declare o pixel como visitado;
- crie um nova celula para o pixel;
- insira a celula na lista de pixels;
- faça as chamadas recursiva
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Então, antes de fazer as chamadas recursivas, devo já guardar o pixel? Por que, quando o pixel não serve as condições da base (isto é, não foi visitado e tem a mesma cor da semente) eu primeiro realizava as chamadas recursivas para pegar os vizinhos dele e, aí sim, o guardava, desse modo, eu já retornava para a chamada anterior aquele pixel mais a quantidade de vizinhos que ele tem.
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Então, antes de fazer as chamadas recursivas, devo já guardar o pixel?
Só depois de passar pela base.
Isso vai ajudar a você ter pixels na lista a todo instante.
Entendi que era isso que você queria fazer: já ter pixels na lista a medida que a recursão avança.
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Entendi que era isso que você queria fazer: já ter pixels na lista a medida que a recursão avança.
Sim, estou tentando fazer isso. Sempre quando eu encontro um pixel já visitado ou de cor diferente, eu devolvo zero (já que esse pixel não deve ser contado) e adiciono o meu pixel que chamou a chamada recursiva desse vizinho na lista.
O problema é: ele não está realizando todas as chamadas recursivas que deveria e acaba entrando em looping.
Quando uso o comando valgrind, ele me retorna os seguintes erros:
- Invalid read of size 8
- Invalid read of size 1
- Process terminating with default action of signal 11 (SIGSEGV)
- Access not within mapped region at address 0x7
Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao
Sempre quando eu encontro um pixel já visitado ou de cor diferente, eu devolvo zero
ou fora da imagem, certo?