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.
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".
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.
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.
(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 .
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?
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))
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));
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.
Oi Lucas,
na monitoria, o Caio me mostrou onde eu estava errando:. . .
Muito obrigado por compartilhar onde estava o problema.
Isso ajuda a todos!
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 =]