Segfault ao ler os pixels

Segfault ao ler os pixels

por Lucas Silva -
Número de respostas: 8

Estava testando algumas funções do ep em outro programa, e, ao tentar ler uma imagem .ppm e guardar o valor de cada pixel, ele dá segmentation fault, porém, se eu mando imprimir o valor de cada pixel da matriz antes de eles serem setados, ele imprime sem nenhum problema.

Em resposta à Lucas Silva

Re: Segfault ao ler os pixels

por Edgar Bernardi Righi -

O meu também dava isso. Cometi dois erros:

1) Verifique se vc não está usando pixel[w][h] ao invés de pixel[h][w] (que é o correto).

2)Não tente alocar a matriz pixel de uma vez. Primeiramente aloque uma lista de ponteiros (PixelRGB*). Depois, dê um loop e aloque em cada posicao pixel[h] uma lista de (PixelRGB).

Bom, agora deve funcionar. Qualquer procure no google "malloc a matrix".

Em resposta à Edgar Bernardi Righi

Re: Segfault ao ler os pixels

por Lucas Silva -

Eu fiz isso, mas acho que o problema não está aí, dado que eu testei a função no meu notebook e no computador da rede linux e funcionou normalmente, creio que seja alguma limitação (que eu ainda não faço ideia do que seja)  do computador onde eu estava testando anteriormente.

Em resposta à Edgar Bernardi Righi

Re: Segfault ao ler os pixels

por José Coelho de Pina -

Ois Lucas e Edgar,

ao tentar ler uma imagem .ppm e guardar o valor de cada pixel, ele dá segmentation fault,

Você está usando a função carregueImagemPPM do módulo io.c?
Você pode colocar aqui o arquivo com a imagem para darmos uma olhada?

1) Verifique se vc não está usando pixel[w][h] ao invés de pixel[h][w] (que é o correto).

Fiz este mesmo erro uma ou outra vez. . .

2)Não tente alocar a matriz pixel de uma vez. Primeiramente aloque uma lista de ponteiros (PixelRGB*). Depois, dê um loop e aloque em cada posicao pixel[h] uma lista de (PixelRGB).

É isso ai!
No EP, essa é a missão da função mallocImagemRGB.

Qualquer procure no google "malloc a matrix"

Alternativamente, olhe o conteúdo das anotações da aula 07. piscando
(Como dizem, a propaganda é a alma do negócio.)

acho que o problema não está aí, dado que eu testei a função no meu notebook e no computador da rede linux

Na Rede Linux o S.O. é  linux sorriso.
Qual o S.O. que roda no seu notebook?
Qual o S.O. do computador que você estava usando anteriormente e deu o pau?
Você (ainda) consegue reproduzir o pau nesse outro computador?
Você já descobriu qual era o problema?

 

Em resposta à José Coelho de Pina

Re: Segfault ao ler os pixels

por Lucas Silva -

Qual o S.O. que roda no seu notebook? 
Qual o S.O. do computador que você estava usando anteriormente e deu o pau?

Nos dois, utilizo o ubuntu (no notebook uso através duma máquina virtual) , no notebook, utilizo a versão mais recente, já no computador onde deu o pau, utilizo a 12.04.

Você já descobriu qual era o problema?

Ainda não, tentei usar o GDB pra descobrir qual o problema, mas não consegui.

2)Não tente alocar a matriz pixel de uma vez. Primeiramente aloque uma lista de ponteiros (PixelRGB*). Depois, dê um loop e aloque em cada posicao pixel[h] uma lista de (PixelRGB).

eu até fiz desse jeito, porém não consegui entender o porquê de não poder fazer direto img->pixel = mallocSafe(m*sizeof(pixel))

 

Em resposta à Lucas Silva

Re: Segfault ao ler os pixels

por José Coelho de Pina -

não consegui entender o porquê de não poder fazer direto img->pixel = mallocSafe(m*sizeof(pixel))

Vamos por partes

    img->pixel = mallocSafe(m*sizeof(pixel))

O que vai entre parênteses do sizeof deve ser um tipo, sizeof(tipo), certo?
Por exemplo,

    vetor = malloc(m * sizeof(int)); 
Em resposta à José Coelho de Pina

Re: Segfault ao ler os pixels

por Lucas Silva -

Professor,

na monitoria, o Caio me mostrou onde eu estava errando: acontece que, eu declarava primeiramente img->pixel =mallocSafe (m*sizeof(PixelRGB))

ao invés de img->pixel = mallocSafe(m*sizeof(PixelRGB*)),  por isso,  dava segmentation fault. Foi pura sorte minha os compiladores na rede linux e no meu notebook terem adicionado esse '*' na hora de alocar a memória.

Em resposta à Lucas Silva

Re: Segfault ao ler os pixels

por Caio Braz -

Só pra corrigir um pequeno erro que eu cometi ao explicar o que houve:

De fato eu falei que o compilador poderia ter "colocado" (na verdade, induzido) o '*' ali, mas depois pensei com mais calma e vi que não teria porque ele induzir isso...

A falta do '*' fazia com que o bloco de memória alocado em img->pixel fosse do tamanho errado, isso pode gerar um monte de problemas que acabam culminando em uma Seg.Fault, ou por alguma sorte, funcionar aparentemente normal.

Eu diria que isso depende, a princípio, da política de alocação da memória do S.O. e de como ele controla os blocos de memória "dados" a processos do usuário. Mas pode ter muito mais coisa envolvida nessa sorte/azar.

Notando também que versões distintas de compiladores podem ter opções "default" diferentes e talvez se protejam de certos problemas, o que também pode estar incluso na sorte/azar.

Espero ter conseguido deixar um pouco menos obscuro =]