Ir ao conteúdo
  • Cadastre-se

Erro "segmentation fault" programa em c.


Posts recomendados

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

Link para o comentário
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.
Link para o comentário
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

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...