Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por Lucas Silva -
Número de respostas: 7

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...

Em resposta à Lucas Silva

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por José Coelho de Pina -

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.

Em resposta à José Coelho de Pina

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por Lucas Silva -

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.

Em resposta à Lucas Silva

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por José Coelho de Pina -

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:

  1. declare o pixel como visitado;
  2. crie um nova celula para o pixel;
  3. insira a celula na lista de pixels;
  4. faça as chamadas recursiva
Em resposta à José Coelho de Pina

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por Lucas Silva -

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.

Em resposta à Lucas Silva

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por José Coelho de Pina -

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.

Em resposta à José Coelho de Pina

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por Lucas Silva -

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
Em resposta à Lucas Silva

Re: Stack overflow in thread 1: can't grow stack to 0xbe028ff8 na funcao pixelsRegiao

por José Coelho de Pina -

Sempre quando eu encontro um pixel já visitado ou de cor diferente, eu devolvo zero

ou fora da imagem, certo?