Olá, sou iniciante na linguagem C e comeceia usar ponteiros recentemente.
Poderiam me ajudar com os eguinte código, no momento em que chama o metodo faz() para imprimir o codigo de uma struct que está pontada por um ponteiro está imprimindo um valor incorreto. Mas é impresso correto se eu imprimir no método main().
Estou quebrando a cabeça para descobrir o porque disso:
Pergunta
rpmarques
Olá, sou iniciante na linguagem C e comeceia usar ponteiros recentemente.
Poderiam me ajudar com os eguinte código, no momento em que chama o metodo faz() para imprimir o codigo de uma struct que está pontada por um ponteiro está imprimindo um valor incorreto. Mas é impresso correto se eu imprimir no método main().
Estou quebrando a cabeça para descobrir o porque disso:
#include <stdio.h>
#include <stdlib.h>
int verifica(int codigo);
void incluir();
void faz();
struct livro *ptPrimeiro;
struct livro *ptUltimo;
#define TAM 10;
int numEl = 0;
struct info{
char val[100];
};
struct livro{
//indices = 0-codigo 1-titulo 2-autor 3-editora 4-cidade
int codigo;
struct info inf[5];
struct livro *ptAntLivro;
struct livro *ptProxLivro;
};
int main()
{
int opcao = 0;
while(1){
printf("\n1- Cadastrar um livro\n2- Remove livro\n3- Lista livros");
printf("\nDigite sua opcao: ");
scanf("%d", &opcao);
switch(opcao){
case 1:
incluir();
break;
case 2:
break;
case 3:
faz();
}
//AQUI FUNCIONA, IMPRIME CORRETO O VALOR
printf("\nsegundo testeFIM: %d", (*ptUltimo).codigo);
}
}
void incluir(){
int codigo = 0;
printf("\nDigite o codigo do livro que sera inserido: ");
scanf("%d", &codigo);
//verifica se já há um cadastro de livro com este codigo, chamando o metodo verifica e passado o codigo como parametro
if(verifica(codigo) == 1){
printf("\nCódigo já existe!");
}
else{
struct livro novoLivro; //cria um novo registro
novoLivro.codigo = codigo;
printf("\n%d", novoLivro.codigo);
struct info iTitulo;
struct info iAutor;
struct info iEditora;
struct info iCidade;
fflush(stdin);
char teste[10];
printf("\nDigite o Titulo do livro: ");
//gets(iTitulo.val);
gets(teste);
fflush(stdin); //serve para limpar o buffer de leitura
novoLivro.inf[0] = iTitulo; //guarda titulo no indice 1
printf("\nDigite o nome do autor: ");
gets(iAutor.val);
novoLivro.inf[1] = iAutor; //guarda autor no indice 2
printf("\nDigite o nome da editora: ");
gets(iEditora.val);
novoLivro.inf[2] = iEditora; //guarda editora no indice 3
printf("\nDigite a cidade: ");
gets(iCidade.val);
novoLivro.inf[3] = iCidade; //guarda cidade no indice 4
if(numEl == 0){
ptPrimeiro = (struct livro*) malloc(sizeof(struct livro));
ptPrimeiro = &novoLivro;
ptUltimo = (struct livro*) malloc(sizeof(struct livro));
ptUltimo = &novoLivro;
printf("\nsegundo teste: %d", (*ptUltimo).codigo);
numEl++;
}
else{
novoLivro.ptAntLivro = &ptUltimo;
//struct livro **pt;
//pt = &ptUltimo.ptProxLivro;
// struct livro tmp = *ptUltimo;//melhorar isso
// tmp.ptProxLivro = &novoLivro;
(*ptUltimo).ptProxLivro = &novoLivro;
novoLivro.ptProxLivro = NULL;
printf("\nprimeiro teste: %d", novoLivro.codigo);
ptUltimo = (struct livro*) malloc(sizeof(novoLivro));
ptUltimo = &novoLivro;
printf("\nsegundo teste: %d", (*ptUltimo).codigo);
numEl++;
}
printf("\nLivro cadastrado com sucesso!");
}
}
int verifica(int codigo){
int i;
struct livro *tmp = ptPrimeiro;
for(i = 1; i <= numEl; i++){
if(codigo == (*tmp).codigo){
return 1;
}
else{
tmp = (*tmp).ptProxLivro;
}
}
return 0;
}
void faz(){
int a = (*ptUltimo).codigo;
printf("\nsegundo teste: %d", a);
}
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.