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

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!