Ir ao conteúdo
  • Cadastre-se

Problema- falha de segmentação lista dinamica


Luã Faria

Posts recomendados

Apos executar a função lerDados , que consegue encadear uma lista com nos que contem retas, quando tentar usar a função retas_verticais com um simples printf recebo falha na segmentação... se eu usar somente a imprime_lista funciona certinho..

#include<stdio.h>
#include<stdlib.h>
typedef struct{
	int x,y;
}ponto;
typedef struct a{
	ponto p1,p2;
	struct a *prox;
}no;

no *aloca_no(){//aloca espaço de memoria para conter um no
	no *a;
	if(!(a=(no*)malloc(sizeof(no))))
		exit(1);
	a->prox = NULL;
	return a;
}
void imprime_lista(no *imprime, char *nome){// imprime as retas contidas nos nós da lista
	no *aux = imprime;
	while(aux){
		printf("-----------------------%s-----------------------\n%d %d || %d %d\n", nome,aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y);
		aux = aux->prox;
	}
}
void incluir_no(no **lista, no*novo){// inclui um no na lista
	if(*lista == NULL){
		*lista = novo;
	}
	else{
		no *aux = *lista;
		while(aux->prox)
			aux = aux->prox;
		aux->prox = novo;
	}
}
void lerDados(no **dadosEntrada, char *local){// le os dados do arquivo em um no e chama a função incluir no para coloca-lo na lista
	FILE *arquivo;
	no *acc;
	if(!(arquivo = fopen(local,"r"))) 	
		exit(1);
	else{
		printf("Foi\n");
		while(!(feof(arquivo))){ 
			acc = aloca_no();
			fscanf(arquivo,"%d %d %d %d\n", &(acc->p1.x), &(acc->p1.y), &(acc->p2.x), &(acc->p2.y));
			incluir_no(dadosEntrada, acc);
		}
		fclose(arquivo);
	}
}
void retas_verticais(no *dadosEntrada, no *verticais){// não funciona, causa falha na segmentação
	printf("uéé");
}
void main(){
	no *dadosEntrada, *verticais, *horizontais, inclinadas;
	char local[50]="/home/lua/Workspace/Algoritmos2/dados.txt";	
	lerDados(&dadosEntrada, local);
	imprime_lista(dadosEntrada, "Dados Brutos");// imprime os dados da lista perfeitamente
	retas_verticais(dadosEntrada, verticais);// se eu apagar essa linha o programa funciona, se nao tenho falha na segmentação
}

 

 

 

ex2.c

dados.txt

Link para o comentário
Compartilhar em outros sites

@Luã Faria Ponteiro de ponteiro é muito chato... Bem, você tem alguns problemas ai, um bem fácil de notar é que a função "inclui_no", não está inserindo na primeira célula.

Outra coisa que observei foi que seu arquivo.txt não funciona com a minha modificação do seu fonte, talvez pela codificação, tente criar um arquivo com o notepad++ ou use esse: dados111.txt

 

Já o código, fiz apenas algumas modificações e testes, mas não tenho muito conselho pra te dar, talvez esse código te ajude a enxergar onde você está errando.
 

#include<stdio.h>
#include<stdlib.h>
typedef struct {
   int x, y;
} ponto;

typedef struct a {
   ponto p1, p2;
   struct a *prox;
} no;

no *aloca_no() { //aloca espaço de memoria para conter um no
   no *a;
   if ( !( a = ( no* )malloc( sizeof( no ) ) ) )
      exit( 1 );
   a->prox = NULL;
   return a;
}

void imprime_lista( no *imprime, char *nome ) { // imprime as retas contidas nos nós da lista
   printf( "\n ------------------INICIO--- IMPRIME_LISTA ----------------------------\n" );
   no *aux = &imprime;
   int i;

   for ( i = 0; aux; i++) {
      //não imprime a primeira célula
      //if (i != 0)
      printf( "-----------------------%s-----------------------\n%d %d || %d %d\n", nome, aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );

      aux = aux->prox;
   }
   printf( "\n-------------------FIM-- IMPRIME_LISTA ----------------------------\n" );
}

void incluir_no( no **lista, no *novo ) { // inclui um no na lista
   printf( "\n -----------------------INICIO--INCLUIR_NO-------------------------\n" );
   if ( lista == NULL ) {
      lista = novo ;
      printf("\nIncluiu o primeiro no");
   }
   else {
      no *aux = lista;
      while ( aux->prox ) {
         aux = aux->prox;

         printf( "\nPassou por: %d %d %d %d\n", aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );
         getchar();
      }

      aux->prox = novo;
      printf( "\nIncluiu: %d %d %d %d\n", aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );
   }
   printf( "\n-----------------------FIM--INCLUIR_NO-------------------------\n" );
}

void lerDados( no **dadosEntrada, char *local ) { // le os dados do arquivo em um no e chama a função incluir no para coloca-lo na lista
   FILE *arquivo;
   no *acc;
   int contador = 0;
   printf( "\n-----------------------INICIO--Ler_DADOS-------------------------\n" );

   if ( !( arquivo = fopen( local, "r" ) ) )
      exit( 1 );
   else {
      while ( !( feof( arquivo ) ) ) {
           printf( "\n-----------------------LOOP--INCIAL--Ler_DADOS-------------------------\n" );
         acc = aloca_no();
         fscanf( arquivo, "%d %d %d %d\n", &( acc->p1.x ), &( acc->p1.y ), &( acc->p2.x ), &( acc->p2.y ) );



         //para observações
         printf( "\nLeitura %d: ", contador + 1 );
         printf( "%d %d %d %d\n", acc->p1.x, acc->p1.y, acc->p2.x, acc->p2.y );
         contador ++;
         printf( "\n-----------------------LOOP--FINAL--Ler_DADOS-------------------------\n" );


         incluir_no( &dadosEntrada, acc );

      }
      fclose( arquivo );
   }
      printf( "\n-----------------------FIM--Ler_DADOS-------------------------\n" );
}
void retas_verticais( no *dadosEntrada, no *verticais ) { // não funciona, causa falha na segmentação
   printf( "uéé" );
}

void main() {
   no *dadosEntrada, *verticais, *horizontais, inclinadas;
   char local[50] = "dados111.txt";

   lerDados( &dadosEntrada, local );
   imprime_lista( dadosEntrada, "Dados Brutos" ); // imprime os dados da lista perfeitamente
   retas_verticais( dadosEntrada, verticais ); // se eu apagar essa linha o programa funciona, se nao tenho falha na segmentação
}

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!