Ir ao conteúdo
  • Cadastre-se
francisc0j0se

Erro "segmentation fault" programa em c.

Recommended Posts

Ola,  sou novo no forum, e estou fazendo um trabalho de faculdade em c, usando arvores avl e arvores b. Fiz o programa coforme o enunciado, mas fiz usando o windows como sistema operacional, so que depois o professor exigiu que tinha que compilar usando o linux. Usei tanto no windows quanto no linux o compilador gcc. No windows ta tudo perfeito sem erros. Ja ao compilar no linux o programa e compilado, e quando vou executar, da erro de segmentation fault. 
 
Estou quebrando acabe;a e nao consigo achar o erro. Usei o gdb pra debugar e ele apontou problema na linha 157 do arquivo b_voo.c Vou postar o codigo e queria pedir a juda de vocês. Acho que deve ser coisa boba, mas como nao tenho muita experiencia com c ainda, nao estou achando a solucao para meu problema. Conto com todos. Obrigado.
 
segue anexo com os arquivos .c

Download (1).tar.gz

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece que você está usando um compilador muito defasado.

Se conseguiu compilar esse código até o final, o compilador realmente está muitos problemas.

 

Seu código está com dependência cíclica: Bibliotaca A <-> Biblioteca B

 

Veja parte do resultado da minha compilação (pois tive de parar a compilação):

In file included from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10:0,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10,                 from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6,                 [...]
 
Para evitar esse tipo de situação, utiliza-se controles de "#define" em cada biblioteca ("main.c" não precisa):
#ifndef _LIB_A#define _LIB_A // Aqui vai o conteúdo da biblioteca......  #endif
 
Agora aplicando o controle, parte do resultado foi esse:
In file included from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6:0:X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c: In function 'proximo_b':X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:54:16: error: dereferencing pointer to incomplete type         if( pai->entradas > 0 )  // apenas para assegurar que a arvore tem                ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:59:33: error: dereferencing pointer to incomplete type             for(pos=0; pos < pai->entradas-1; pos++) //percorre todos os filhos                                 ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:65:32: error: dereferencing pointer to incomplete type                 if( strcmp( pai->voo[pos].chave, atual.chave ) == 0 )                                ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:68:39: error: dereferencing pointer to incomplete type                     for(j=pos+1; j<pai->entradas; j++)  // se encontrou,                                       ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:76:31: error: dereferencing pointer to incomplete type                         if(pai->voo[j].chave[0] != '#')                               ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:78:39: error: dereferencing pointer to incomplete type                             return pai->voo[pos+1]; // retorna o próximo se
 
Isso confirma que o compilador não conseguiu buscar a chamada para a função na biblioteca seguinte, fazendo com que o ponteiro não possuísse uma referência.
E compilador que deixa isso passar, realmente vai dar erro de "Segmentation Fault".
 
Estou utilizando interface gráfica Code::Blocks com compilador MinGW GCC 4.8.1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por aqui não cheguei a ter problemas com a compilação (MinGW / Linux Debian) desse código... O que ficou faltando mesmo foi você postar a entrada de dados do programa que funciona bem no Windows e faz dar pau no Linux. O programa em si consigo rodar tanto no Linux quanto no Windows.

 

 

 

 

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri porque eu não conseguia compilar.

Estão utilizando o gcc sem referencia para as bibliotecas.

Dessa forma o compilador permite a interpretação das funções mesmo com dependência cíclica.

 

Após compilar, fui fazer uns testes e percebi que o código trata bem pouco as referências passadas por parâmetro.

Por exemplo, a remoção de um voo em uma raiz vazia gerou, como esperado, segmentation fault.

 

Aconselho primeiro a rever todas as validações desse tipo. Assim assegura que, caso apareçam novos erros, serão por outros motivos.

 

Se passar o formato e sequencia das entradas para o programa, facilita para que possamos testar mais.

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×