Segmentation fault em myKeyboard

Segmentation fault em myKeyboard

por Gustavo Estrela de Matos -
Número de respostas: 10

Olá pessoal.

Já estou há algum tempo tentando resolver um segmentation fault que acontece quando eu aperto 'r'. 

Usando o gdb eu tive a seguinte mensagem:
"

graphic: chamando a funcao pinteImagemRGB.

graphic: voltei da funcao pinteImagemRGB.

Program received signal SIGSEGV, Segmentation fault.
0x00000000004017c9 in myKeyboard (key=114 'r', mx=11, my=54) at graphic.c:179
179 cor[RED] = _imgOriginal->pixel[pixel->h][pixel->w].red;

"

Aí eu fiquei na dúvida se eu não estaria confundindo os valores de h e w... Eles devem valer de 0 até height-1 para h e 0 até width-1 para w certo?

Em resposta à Gustavo Estrela de Matos

Re: Segmentation fault em myKeyboard

por José Coelho de Pina -

Aí eu fiquei na dúvida se eu não estaria confundindo os valores de h e w... Eles devem valer de 0 até height-1 para h e 0 até width-1 para w certo?

É isso ai!

Em particular, nesse trecho de código, ocorreria um segmentation fault se a lista de pixels em uma região estivesse vazia.
Uma região sem pixels. Talvez você pudesse colocar o seguinte código antes no imagem.c

 pixel = _pRegiao->ini;
 if (pixel == NULL) 
   {
     printf("\graphic: regiao sem pixels!\n");
     break;
   } 
 cor[RED]   = _imgOriginal->pixel[pixel->h][pixel->w].red;
 [...]

 

Em resposta à José Coelho de Pina

Re: Segmentation fault em myKeyboard

por Gustavo Estrela de Matos -

Coelho, eu printei todas as regiões da imagem0.ppm e ela possui 502 regiões, assim como o executável que você mandou de exemplo. A única diferença é que a minha fila tá ao contrário.

Em resposta à Gustavo Estrela de Matos

Re: Segmentation fault em myKeyboard

por José Coelho de Pina -

A única diferença é que a minha fila tá ao contrário.

Hmmm. O problema não é ai.
Como estamos usando listas de pixels, listas de regiões, a ordem é irrelevante.

Em resposta à José Coelho de Pina

Re: Segmentation fault em myKeyboard

por Gustavo Estrela de Matos -

Obrigado Coelho! É isso mesmo. Vou dar uma procurada e vejo o que eu esqueci de fazer aprovo

Em resposta à Gustavo Estrela de Matos

Re: Segmentation fault em myKeyboard

por Gustavo Estrela de Matos -

Problema resolvido! Era bem simples... quado eu criava as regiões eu esquecia que ela teria ao menos o primeiro pixel que seria a "cabeça" da nova região. maneiro

Em resposta à Gustavo Estrela de Matos

Re: Segmentation fault em myKeyboard

por Daniel Iwamoto -

Tenho um problema parecido.

Quando compilo e o progama vai mostrar a tela do OpenGL ele trava.

Quando uso o modo Debug do CodeBlocks a tela aparece, porém como uma janela preta minimizada. Nesse modo consigo clicar na tela preta, apertar 'g','l','q' e 'o' sem problemas. Ao apertar 'r' ele dá segfault In myKeyboard () ()

Minhas listas(pixel e região) possuem NULL (verifiquei imprimindo os valores de prox) e o numero de pixels bate com o exemplo. Testei as imagens 0 e 1.

 

Erros (que aparecem na janela Call Stack):

Address: 00401589  Function: myKeyboard()

Address: 00408060 Function:_data_start__()

                                      Function: ??()

 

Em resposta à Daniel Iwamoto

Re: Segmentation fault em myKeyboard

por José Coelho de Pina -

Oi Daniel,

Quando compilo e o progama vai mostrar a tela do OpenGL ele trava.

Bem, a unica razão que eu posso imaginar para travar nesse ponte seria tela não conter (uma cópia d)a imagem original.
Por exemplo, se no main:

  • no passo 2, a imagem for carregada diretamente em tela e
  • o seu programa não fizer mais nada nos passos 3, 4 e 5

então na chamada para myInit no passo 6 cuidará para que a janela com a imagem será criada e exibida. Teste isto.

Além disso o programa imprime algumas mensagens no shell, tais como

Arquivo 'ppm/imagem.ppm' com a imagem foi aberto.
A imagem foi carregada e o arquivo 'ppm/imagem.ppm' foi fechado.


Tecle:  'r' para mostrar uma (r)egiao na tela
        'o' para mostrar a imagem (o)riginal na tela
        'l' para (l)impar a tela
        'g' para (g)ravar a imagem atual em um arquivo
        'q' para (q)uit, encerrar o programa.
Clique: em um pixel para alterar a cor

Essa mensagens podem indicar onde o programa explodiu.
O ponto onde ele explode não é necessariamente onde está o erro, mas já é um começo.

Resumindo, pelo comportameto que você descreve, o programa não chegar a mostrar a imagem e travar ai, sugere para mim que há algum em um dos seguintes passos:

 /* 3 crie a tela (imagem) em que trabalharemos */
 [...]

 /* 4 copie a imagem lida para a tela */ 
 [...]

Verifique as funções mallocImagemRGB e copieImagemRGB. Em particular, na função copieImagemRGB, não deixe de copiar os campos height e width da origem para o destino.