Erro na criação da lista de pixels (função regioesImagem)

Erro na criação da lista de pixels (função regioesImagem)

por Shayenne Luz Moura -
Número de respostas: 9

Não, esse erro acontece ainda no momento da criação da lista de pixels com mesma cor.

Ele cria a primeira região alocando uma variável CelRegiao "nova", entra na função pixelsRegiao, cria uma CelPixel "novo" para cada pixel encontrado da mesma cor, aponta o endereço nova->prox para o lista->prox e lista->prox para nova.

Depois dá free na variável CelPixel "novo". Isso se repete até que todos os pixels vizinhos e de mesma cor sejam visitados.

Volta para a função regioesImagens e dá free na CelRegiao "nova". Quando volta, para criar a segunda região, acontece esse erro.

(Editado por José Coelho de Pina - Saturday, 7 September 2013, 16:13)

Shayenne, movi a sua mensagem para um novo tópico pois pareceu mais apropriado.
Tive a impressão que esta discussão ficaria perdida no tópico que  trata de problemas com a opção 'q' (quit), liberação da memória alocada.

coelho

 

 

Em resposta à Shayenne Luz Moura

Re: Erro na criação da lista de pixels

por José Coelho de Pina -

Ele cria a primeira região alocando uma variável CelRegiao "nova"...

Deixe eu ver se entendi.
No coração da função regioesImagens temos a estrutura:

   if ("encontrei um pixel que ainda nao está em alguma região")
   {
       /* 1. crie uma nova celula para armazenar infos de uma regiao */
       [. . .]

       /* 2. armazene as infos da regiao nessa nova celula */
       /* 2.1 inicializa ponteiro para a lista de pixels da regiao */
       [. . .]

       /* 2.2 armazene as cores da regiao */
       [. . .]

       /* 2.3 armazene o numero de pixels na regiao e insere os pixels na lista
              de pixels. Para isto use a funcao pixelsRegiao 
       */
	
       /* 3  insira a nova celula no comeco da lista de regioes */
    }

Note que esta estrutura de passos é basicamente a mesma decrita no tópico "Problemas na recursão (pixelsRegiao)" criado pelo João.
Inserir em uma lista de inteiros é a mesma coisa que inserir em uma lista de regiões que é a mesma coisa inserir em uma lista de pixels ...
Isto aparece no início da aluna 09, na função:

void insere(int x, Celula **ini);

entra na função pixelsRegiao, cria uma CelPixel "novo

Na função pixelsRegiao não há nenhum free, só mallocSafe.
De uma olhada no tópico "Problemas na recursão (pixelsRegiao)" criado pelo João.

Em resposta à Shayenne Luz Moura

Re: Erro na criação da lista de pixels

por Fernanda de Camargo Magano -

Quando volta, para criar a segunda região, acontece esse erro.

Shayenne, eu não sei se eu entendi certo, mas você está dando free ao longo da criação da lista, no ponteiro que vc não usaria mais?

Será que com isso, você não está liberando a célula que você acabou de criar? Porque se for isso,  somente a célula atual é mantida e as informações anteriores são perdidas.

Em resposta à Fernanda de Camargo Magano

Re: Erro na criação da lista de pixels

por Shayenne Luz Moura -

Eu retirei os frees porque realmente, como a Fernanda disse, estava perdendo as informações.

Daí, o programa rodou certinho até chamar a função MyInit. Então aconteceu isso:

 free(): corrupted unsorted chunks

e mostrou o mapa de memória.

Em resposta à Shayenne Luz Moura

Re: Erro na criação da lista de pixels

por José Coelho de Pina -

Daí, o programa rodou certinho até chamar a função MyInit. Então aconteceu isso:

 free(): corrupted unsorted chunks

Acho que eu não entendi alguma coisa. Explico. O programa não chama a função free antes da execução chegar até a função myInit.
O únicos lugares onde eu imagino que haja free é nas funções freeImagemRGB e freeRegiões que só vão ser chamadas peloa opção 'q' (quit).

De qualquer maneira, sugiro que você coloque uns prints para descobrir onde o programa explode. Por exemplo, antes de chamada de myInit você poderia colocar:

printf("Vou entrar no myInit\n");
Em resposta à José Coelho de Pina

Re: Erro na criação da lista de pixels

por Shayenne Luz Moura -

Ele entra no myInit...

Coloquei prints no arquivo graphic.c e o programa explode quando entra na função  glutInit(argc, argv);

Só apareceu o print anterior a essa função, e todos eles tinham '\n'.

Em resposta à Shayenne Luz Moura

Re: Erro na criação da lista de pixels

por João Henrique Luciano -

Tenta verificar se você não deixou algum free() perdido ali no meio do seu código. Quando fui debugar o meu,  coloquei alguns printfs junto com o gdb e ajudaram muito, mas foi cansativo tirá-los depois.

Outra coisa a se verificar é se você inicializou os ponteiros de listas corretamente. Como a Giovana me explicou, se você não colocar um "NULL" no final da lista, vai acabar estourando na hora da chamada de funções como o trocaCorRGB pelo myInit.

Em resposta à João Henrique Luciano

Re: Erro na criação da lista de pixels

por Shayenne Luz Moura -

João, verifiquei tudo isso... Não tem nenhum free sobrando e finalizei direitinho as listas. Mas continua com o mesmo erro.

 

Em resposta à Shayenne Luz Moura

Re: Erro na criação da lista de pixels (função regioesImagem)

por Shayenne Luz Moura -

A função está alocando até 5396 pixels e dá seg fault. Há alguma explicação para isso?