Segmentation fault em c

1. Segmentation fault em c

Manuella Prados Simoes
manups19

(usa Outra)

Enviado em 07/11/2015 - 19:02h

Boa noite, preciso de ajuda para acha o motivo do segmentation fault em meu programa.
Sintetizando a ideia: devo ler um arquivo contendo um labirinto(.txt) e com um robo fictício contar o numero de premios coletados e buracos vistos. O caminho percorrido por ele deve ser empilhado e desempilhado(e empilhado novamente) quando ele precisar passar por um mesmo ponto. O robo deve percorrer o labirinto todo.
O erro se encontra na chamada da funcao ProcuraCaminho.

Me ajudem a resolver isso por favor.

OBS.: nao estranhem se estiver meio estranho, nao esta terminado.
OBS.2: so foi apresentado a parte do codigo com problemas.


#include <stdio.h>
#include <stdlib.h>
#include "TElemento.h"
#include "TLabirinto.h"

int main()
{
TLabirinto *labirinto,*labirintoaux;
TElemento inicio;
labirinto=LLeArq();

//struct TCampo *caminho;
if ( Origem(labirinto,&inicio) == 1 )
printf(" A origem 0 na posicao (%d,%d).\n\n",inicio.x,inicio.y);

labirintoaux=Alocar_matrizaux(labirinto,labirinto->linha,labirinto->coluna);

ProcuraCaminho(labirintoaux,labirinto,inicio); //<----------segmentation fault

______________________________________________________________

void ProcuraCaminho(TLabirinto *MLabaux,TLabirinto *MLab,TElemento inicio)
{
int unitaria,p,b;
TPilha Caminho;
TElemento dado,dapilha;
PVazia(&Caminho);

if(EhVazia(&Caminho) == 1)
Empilha(&Caminho,&inicio);

p=0;
b=0;

for(unitaria = 0; unitaria != 1; )
{
Desempilha(&Caminho,&dapilha);
dado.x = dapilha.x ; dado.y = dapilha.y+1;
if((MLab->matriz[dado.x][dado.y]!= 'x' || MLab->matriz[dado.x][dado.y] != 'b') && (MLabaux->matrizaux[dado.x][dado.y] != 1))
{
direita(MLabaux,MLab,&dado,&p,&b,&Caminho);
}

dado.x = dapilha.x ; dado.y = dapilha.y-1;
if((MLab->matriz[dado.x][dado.y]!='x' || MLab->matriz[dado.x][dado.y] != 'b') && (MLabaux->matrizaux[dado.x][dado.y] != 1))
{
esquerda(MLabaux,MLab,&dado,&p,&b,&Caminho);
}
dado.x = dapilha.x+1 ; dado.y = dapilha.y;
if((MLab->matriz[dado.x][dado.y]!= 'x' || MLab->matriz[dado.x][dado.y] != 'b') && (MLabaux->matrizaux[dado.x][dado.y] != 1))
{
baixo(MLabaux,MLab,&dado,&p,&b,&Caminho);
}
dado.x = dapilha.x-1 ; dado.y = dapilha.y+1;
if((MLab->matriz[dado.x][dado.y]!= 'x' || MLab->matriz[dado.x][dado.y] != 'b') && (MLabaux->matrizaux[dado.x][dado.y] != 1))
{
cima(MLabaux,MLab,&dado,&p,&b,&Caminho);
}

unitaria = MatrizauxUnitaria(MLabaux,MLab);
//printf("%d",unitaria);
}
printf("\nPremios=%d\nBuracos=%d",p,b);
}


  


2. Re: Segmentation fault em c

Perfil removido
removido

(usa Nenhuma)

Enviado em 08/11/2015 - 03:33h

Uma sugestão é você aprender a usar o gdb.
GDB é um prgrama que serve prá analisar código compilado freiando a execução em linhas marcadas para tal.

Você, por exemplo, marca a linha 37 prá a execução parar nela e executa. Ele pára na linha 37.
Dando um comando, você prossegue a partir dela novamente.
E pode marcar inúmeras linhas de parada.

Você, com o gdb, pode facilmente localizar em qual linha está dando o segmentation fault com esta ferramanta.
Eu aprendi a usar e usei com outras linguagens de programação, por exemplo, com o GNU Assembly.

Uma sugestão de link é https://sourceware.org/gdb/onlinedocs/gdb/
Mas existem dicas em português na internet.

----------------------------------------------------------------------------------------------------------------
# apt-get purge ubuntu

http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: Segmentation fault em c

Manuella Prados Simoes
manups19

(usa Outra)

Enviado em 08/11/2015 - 08:26h


Mas ai que esta o problema, não esta sendo possível fazer isso. Coloco os breakpoints na função q esta dando problemas, faco o debug, e aperto next line para ver a execução por linha, mas quando chega na linha q marquei com segmentation fault ele não "obedece" mais, dai aperto o step into para entrar na função e tentar achar o erro, mas como eu disse, ele para de obedecer. Ou seja, não consigo analisar nada e assim não consigo corrigir o erro.
O que fazer nesse caso???


4. Re: Segmentation fault em c

Manuella Prados Simoes
manups19

(usa Outra)

Enviado em 08/11/2015 - 08:34h

Ele apresenta os seguintes informacoes:

#0 770FF939 ntdll!RtlGetGroupSecurityDescriptor() (C:\Windows\system32\ntdll.dll:??)
#1 77127117 ntdll!KiUserExceptionDispatcher() (C:\Windows\system32\ntdll.dll:??)
#2 0022FBCC ?? () (??:??)
#3 00401413 main() (C:\Users\BYUSER\Documents\manups\algoritmos 2\ROBO\main.c:20)

O que significa???


5. Re: Segmentation fault em c

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/11/2015 - 03:07h

Cara Manu,

Por favor, entenda que faltam informações para poder ajudá-la de modo mais efetivo. Só para lhe dar uma ideia, como se pode dizer o que está errado com as operações que você está fazendo, se você omitiu as definições dos tipos de dados compostos, todas as operações de alocação de memória, e várias funções que você chama dentro da função em que você suspeita que esteja o erro?

Será que sua suspeita sobre a causa do erro está certa? Quando você colocou a mensagem do GDB, ela fez parecer que o erro não está no lugar em que você o apontou, pois ela indica a linha 20 de main.c. O local indicado por você, que seria uma chamada de função que não apareceu no stack trace, estava na linha 18. Como você omitiu a tal linha 20 na sua transcrição parcial (ou, se mudou seu programa entre a primeira postagem e a quarta, não o disse), dá a impressão de que você pode estar olhando no lugar errado.

Ainda sobre GDB, note que seria bom você desligar a otimização de código do compilador durante a fase de depuração. Às vezes o compilador otimiza o código objeto de modo tal que o Assembly correspondente lembra pouco o que seria uma tradução direta do código fonte, inclusive omitindo desvios e substituindo chamadas de funções por expansões inline (o que talvez explique aquele “(??:??)” no penúltimo nível do stack trace).

E mais um ponto: postar código sem a devida indentação atrapalha a visualização. Quando postar códigos aqui, coloque-os entre as tags [code] e [/code].


6. Re: Segmentation fault em c

Manuella Prados Simoes
manups19

(usa Outra)

Enviado em 10/11/2015 - 14:54h

Obrigada pelas dicas. Só pus essa parte do código, pois ele em si era muito grande. Eu consegui corrigir meu erro colocando como ponteiro e o alocando. Assim pude prosseguir com meu trabalho. Agradeco a ajuda :)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts