Ir ao conteúdo
  • Cadastre-se

C Erro em ponteiros em c


Igor Vargas

Posts recomendados

Olá. Estou com o seguinte erro. Na hora de consultar a placa de carro ele mostra que não existe. Na hora de mostrar o Relatório também não esta mostrando. Ao meu ver o código esta certo mas não estou achando o erro.

 

#include <stdio.h>
#include <stdlib.h>


struct FastCar{
	
	char placa[10],descricao[20],fabricante[50],cor[20];
	int ano;
	float preco;
	
};

int i=0;

void Cadastro(struct FastCar fastCar){
	struct FastCar *c;
	c = (struct FastCar*)malloc(sizeof(struct FastCar));
	c = &fastCar;
	int x;
	printf("voce Selecionou Cadastrar Automovel!!\n\n");
	printf("Digite a Placa do Carro:");
	fflush(stdin);
	gets((c + i)->placa);
	
	printf("Digite a Descricao do Carro:");
	gets((c + i)->descricao);
	
	printf("Digite a fabricação do Carro:");
	fflush(stdin);
	gets((c + i)->fabricante);
	
	printf("Digite a Cor do Carro:");
	gets((c + i)->cor);
	
	printf("Digite o Ano de fabricação do Carro:");
	fflush(stdin);
	scanf("%d",&(c + i)->ano);
	
	printf("Digite o Preco do Carro:");
	scanf("%f",&(c + i)->preco);
	
	i++;
	
	
}

void Consulta(struct FastCar fastCar){
		struct FastCar *c;
		c = &fastCar;
		char carro[10];

		printf("voce Selecionou Consultar Automovel!!\n\n");
		printf("Digite A Placa do Carro:");
		fflush(stdin);
		gets(carro);
		int x;
		for(x = 0; x<i; x++){
			if(strcmp(carro,(c + x)->placa)==0){
				printf("Descricao: %s \n",(c + x)->descricao);
				printf("Fabricante: %s \n",(c + x)->fabricante);
				printf("Cor: %s \n",(c + x)->cor);
				printf("Ano de fabricação: %d \n",(c + x)->ano);
				printf("Preco: %.2f \n",(c + x)->preco);
			}else{
				printf("Veiculo nao encontrado!");
				break;
			}	
		}	
}

void Relatorio(struct FastCar fastCar){
		struct FastCar *c;
		c = &fastCar;
		int x;
		printf("voce Selecionou Relatorio Automovel!!\n\n");
		for(x=0; x<i; x++){
				printf("Placa: %s \n",(c + x)->placa);
				printf("Descricao: %s \n",(c + x)->descricao);
				printf("Fabricante: %s \n",(c + x)->fabricante);
				printf("Cor: %s \n",(c + x)->cor);
				printf("Ano de fabricação: %d \n",(c + x)->ano);
				printf("Preco: %.2f \n",(c + x)->preco);
			
		}
}


main(){
	
	struct FastCar fastCar;
	int x;
	printf("Bem vindo a FastCars!!\n\n");
	do{
	printf("O que voce Deseja Fazer?\n");
	printf("1- Cadastrar Automovel\n");
	printf("2- Consultar Automovel\n");
	printf("3- Gerar Relatorio\n");
	printf("4- Sair do Programa\n");
	scanf("%d",&x);
	
	if(x == 1){
		Cadastro(fastCar);
	}else if( x==2){
		Consulta(fastCar);
	}else if( x == 3){
		Relatorio(fastCar);		
	}
		
	}while(x!=4);
}

 

Link para o comentário
Compartilhar em outros sites

Eu dei uma breve olhada no seu código e vi que tem erros básico de operação com ponteiros e alocação de memória. Na função de cadastrar você aloca uma memória e endereça para o ponteiro c e na próxima linha você endereça a struct parametro para c (ou seja você perde a alocação que você fez), além de endereçar uma varável que nem foi iniciada em main. Eu sugiro estudar novamente sobre operações de ponteiros e struct. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@daniel.oliveira Não entendi o que você quis dizer com perder alocação. eu aloco c e depois recebo o endereço que esta no parâmetro. Consegui arrumar, código ficou assim.

 

 

#include <stdio.h>
#include <stdlib.h>


struct FastCar{
	
	char placa[10],descricao[20],fabricante[50],cor[20];
	int ano;
	float preco;
	
};

int i=0;

void Cadastro(struct FastCar **fastCar){
	struct FastCar *c;
	c = (struct FastCar*)malloc(sizeof(struct FastCar));
	c = &fastCar[0];
	int x;
	printf("voce Selecionou Cadastrar Automovel!!\n\n");
	printf("Digite a Placa do Carro:");
	fflush(stdin);
	gets((c+i)->placa);
	
	printf("Digite a Descricao do Carro:");
	gets((c+i)->descricao);
	
	printf("Digite a fabricação do Carro:");
	fflush(stdin);
	gets((c+i)->fabricante);
	
	printf("Digite a Cor do Carro:");
	gets((c+i)->cor);
	
	printf("Digite o Ano de fabricação do Carro:");
	fflush(stdin);
	scanf("%d",&(c+i)->ano);
	
	printf("Digite o Preco do Carro:");
	scanf("%f",&(c+i)->preco);
	
	i++;
	
	
}

void Consulta(struct FastCar **fastCar){
		struct FastCar *c;
		c = &fastCar[0];
		char carro[10];
		if(c == NULL){
			printf("Algo deu errado!");
		}else{
		printf("voce Selecionou Consultar Automovel!!\n\n");
		printf("Digite A Placa do Carro:");
		fflush(stdin);
		gets(carro);
		int x;
		for(x = 0; x<i; x++){
			if(strcmp(carro,(c+x)->placa)==0){
				printf("Descricao: %s \n",(c+x)->descricao);
				printf("Fabricante: %s \n",(c+x)->fabricante);
				printf("Cor: %s \n",(c+x)->cor);
				printf("Ano de fabricação: %d \n",(c+x)->ano);
				printf("Preco: %.2f \n",(c+x)->preco);
			}else{
				printf("Veiculo nao encontrado!");
				break;
			}	
		}	
		}
		
}

void Relatorio(struct FastCar **fastCar){
		struct FastCar *c;
		c = &fastCar[0];
		int x;
		if(c == NULL){
		 printf("Algo deu errado!");	
		}else{
		printf("voce Selecionou Relatorio Automovel!!\n\n");
		for(x=0; x<i; x++){
				printf("Placa: %s \n",(c+x)->placa);
				printf("Descricao: %s \n",(c+x)->descricao);
				printf("Fabricante: %s \n",(c+x)->fabricante);
				printf("Cor: %s \n",(c+x)->cor);
				printf("Ano de fabricação: %d \n",(c+x)->ano);
				printf("Preco: %.2f \n",(c+x)->preco);
			
		}	
		}
		
}

main(){
	
	struct FastCar *fastCar;
	int x;
	printf("Bem vindo a FastCars!!\n\n");
	do{
	printf("O que voce Deseja Fazer?\n");
	printf("1- Cadastrar Automovel\n");
	printf("2- Consultar Automovel\n");
	printf("3- Gerar Relatorio\n");
	printf("4- Sair do Programa\n");
	scanf("%d",&x);
	
	if(x == 1){
		Cadastro(&fastCar);
	}else if( x==2){
		Consulta(&fastCar);
	}else if( x == 3){
		Relatorio(&fastCar);		
	}
		
	}while(x!=4);
}

 

Link para o comentário
Compartilhar em outros sites

main(){
	
	struct FastCar *fastCar; //inicia fastCar que aponta aleatoriamente
  
	...
	
	if(x == 1){
		Cadastro(&fastCar); //chama função Cadastro
      
     ...

void Cadastro(struct FastCar **fastCar){ // ponteiro pra ponteiro?
	struct FastCar *c; //inicia c que aponta aleatoriamente
	c = (struct FastCar*)malloc(sizeof(struct FastCar)); //c aponta para memória inicializada
	c = &fastCar[0]; // c aponta para o que fastCar está apontando - aleatoriamente por que você declarou em main

 

 

 

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, daniel.oliveira disse:

main(){
	
	struct FastCar fastCar;
  
	...
	
	if(x == 1){
		Cadastro(&fastCar); 
      
     ...

void Cadastro(struct FastCar *fastCar){ 
	struct FastCar *c; 
	c = (struct FastCar*)malloc(sizeof(struct FastCar)); 
	c = &fastCar[0]; 

 

O certo seria isso então?

 

 

adicionado 2 minutos depois

@daniel.oliveira O que foi me ensinado é que quando tu aloca a memória ele retorna um ponteiro vazio ou seja tu precisa passar o endereço.

Link para o comentário
Compartilhar em outros sites

@Igor Vargas Pelo que eu entendi você está tentando fazer um vetor dinâmico?

Se sim, vetores não podem ser dinâmicos.

agora se você queria algum tipo de lista, listas encadeadas resolveriam muito bem o problema.

2 horas atrás, Igor Vargas disse:

struct FastCar *fastCar;

O correto seria ter todo o vetor na memoria previamente

struct FastCar *fastCar=malloc(sizeof(struct FastCar)*TAMANHO_DO_VETOR);

Assim você poderia passar o vetor fastCar para todas as funções.

Agora voltando a lista encadeada, eu vou deixar um exemplo simples

/* Libraries */
#include <stdio.h>    /* I/O functions */
#include <stdlib.h>   /* Memory functions */


/* Constants */
#define MAX_NUMBERS 10
#define MAX_CHAR_NAME 10


/* Types */
typedef struct
{
  char phone_number[MAX_NUMBERS];
  char name[MAX_CHAR_NAME];
}TContact;

typedef struct list
{
  TContact contact;
  struct list *next_entry;
}TList;

int main()
{
  TList *first_entry=NULL,*pointer=NULL;
  TContact contact;
  unsigned char key;
  do
  {
    TList *helper=NULL;
    printf("\nDigite o numero de telefone\n\t:");
    scanf("%s",contact.phone_number);
    getchar();
    printf("\nDigite o nome do contanto.\n\t:");
    scanf("%s",contact.name);
    getchar();
    /* Show contact list */
    helper=first_entry;
    if(helper)
      while(helper)
      {
        printf("\nNome:\t%s\nNumero:\t%s\n",helper->contact.name,helper->contact.phone_number);
        helper=helper->next_entry;
      }
    printf("\nDeseja adicionar o contato a list S/N\n\t");
    scanf("%c",&key);
    getchar();
    if(key=='s')
    {
      if(!first_entry)
      {
        /* Reserva espaço na memoria */
        first_entry=malloc(sizeof(TList));
        /* Testa se está tudo Ok */
        if(!first_entry)
        {
          perror("\nErro,\nNão há memoria disponível e o programa sera finalizado!.");
          return(1);
        }
        /* Coloca os dados na lista */
        first_entry->contact=contact;
        first_entry->next_entry=NULL; /* Define o proxímo nó como NULL */
        pointer=first_entry;  /* Passa o primeiro endereço para o ponteiro auxiliar */
      }
      else
      {
        helper=NULL;
        /* Reserva espaço na memoria */
        helper=malloc(sizeof(TList));
        /* Testa se está tudo Ok */
        if(!helper)
        {
          perror("\nErro,\nNão há memoria disponível e o programa sera finalizado!.");
          /* Tenta apagar a lista */
          pointer=first_entry;
          while(pointer)
          {
            first_entry=pointer->next_entry;
            free(pointer);
            pointer=first_entry;
          }
          return(1);
        }
        /* Coloca os dados na lista */
        helper->contact=contact;
        helper->next_entry=NULL;  /* Define o proxímo nó como NULL */
        pointer->next_entry=helper; /* Coloca na lista */
        pointer=helper;   /* Substitui para o proxímo endereço */
      }
      printf("\nContato adicionado na lista com sucesso!\n\n");
    }
    else 
      printf("\nO contato foi descartado.\n\n");
    printf("Deseja sair do program S/N\n\t:");
    scanf("%c",&key);
    getchar();
  }while(key!='s');
  /* Show list */
  pointer=first_entry;
  while(pointer)
  {
    printf("\nNome\t:%s\nNumero\t:%s\n",pointer->contact.name,pointer->contact.phone_number);
    pointer=pointer->next_entry;
  }
  /* Delete list */
  pointer=first_entry;
  while(pointer)
  {
    first_entry=pointer->next_entry;
    free(pointer);
    pointer=first_entry;
  }
  return(0);
}

E só seguir os comentários em português que fica fácil entender.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!