Jump to content

Problema Pointeiros


PCaseiro
 Share

Recommended Posts

Boas malta, tenho um problema com ponteiros. Num projeto vou precisar de pedir o bi ao utilizador várias vezes, pelo que decidi fazer uma função que pedisse o bi para não ter que estar sempre a pedir:

char* pede_bi(char *bi){
printf("Introduza os 8 digitos do BI do doente: ");
fgets(&bi,MAX,stdin);
return bi;
}

função esta que é chamada em:


typedef struct data{

int dia,mes,ano,hora,minutos;

}Data;


typedef struct pnode *paciente;

typedef struct pnode{

char *bi;
char nome[MAX];
Data *info_data;
paciente next;

}pnode;




void admissao_triagem(paciente triagem){
Data d1;
char nome[MAX];
char novo[MAX];
char *bi = (char*)malloc(MAX*sizeof(char));
int dia, mes, ano, hora, minuto,flag = 0;
/* pedir e verificar se o nome introduzido é válido */
do{
 fflush(stdin); /* apaga a memória local */
 printf("Nome: ");
 fgets(nome, MAX, stdin);
 strcpy(novo,paragrafo(nome));
 if ((verifica_nome(novo)==0))
	 printf("Nome Invalido\n");
} while(verifica_nome(novo)!=1);
/* pedir e verificar se o bi é válido */ do{
 fflush(stdin);
 bi = pede_bi(&bi);
 if ((verifica_bi(&bi)==0))
	 printf("BI invalido\n");
}while (verifica_bi(&bi)!=1);

/* pedir e verificar se a data é válida */ do{
 fflush(stdin);
 printf("Data (DD/MM/AAAA): ");
 if (scanf("%d/%d/%d", &d1.dia, &d1.mes, &d1.ano)!=3){
	 printf("A data introduzida não esta no formato DD/MM/AAAA\n");
 }
 else{
	 if(data_valida(&d1)==0){
		 printf("A data introduzida nao esta correcta\n");
	 }
	 else{
		 flag=1;
	 }
 }
}
 while(flag!=1);
/* inscrever_triagem(lista, bi, nome, dia, mes, ano, hora, minuto);*/ flag=1;
/* verificar se a hora é válida */ do{
 fflush(stdin);
 printf("Hora(HH:MM): ");
 if (scanf("%d:%d", &d1.hora, &d1.minutos)!=2){
	 printf("A hora introduzida não esta no formato HH:MM\n");
	 flag=0;
 }
}
while(flag!=1);
inscrever_triagem(triagem,&bi,nome,&d1);
}

void inscrever_triagem(paciente triagem, char *bi, char nome[MAX], Data *d1){
paciente aux;
aux = (paciente)malloc(sizeof(pnode));
if (aux!=NULL){
aux->info_data = (Data*) malloc(sizeof(Data));
aux->bi = (char*) malloc((MAX)*sizeof(char));
strcpy(aux->bi,bi);
strcpy(aux->nome, nome);
aux->info_data->dia = d1->dia;
aux->info_data->mes = d1->mes;
aux->info_data->ano = d1->ano;
aux->info_data->hora = d1->hora;
aux->info_data->minutos = d1->minutos;
aux->next=triagem->next; /* aux->next = NULL */
triagem->next=aux; /* juntar o nó com dados do paciente ao final da lista */
}
else
printf("ERRO!!");
}

O problema que estou a ter é que quando peço para imprimir o bi com esta função:

void imprime_lista (paciente triagem){
paciente l = triagem->next; /* Salta o header */
while (l){
 printf("Paciente: %s BI: %s\n",l->nome,l->bi);
 printf("Data: %d/%d/%d \t Horas: %d:%d", l->info_data->dia,l->info_data->mes,l->info_data->ano,l->info_data->hora,l->info_data->minutos);
 printf("\n");
 printf("\n");
 printf("\n");
 l=l->next;
}
}

ele imprime: Nome: pedro(por exemplo) Bi: primeiros 4 valores que inseri no bi + o nome, isto é, se inserir 12345678 ele imprime 1234pedro.

Alguma ajuda?

Edited by apocsantos
geshi
Link to comment
Share on other sites

Olá Caseiro, certamente não vou resolver o teu problema todo, mas vou dar uma ajuda.

Em vez de fgets podes usar gets, já que estás a usar o teclado como input

http://www.tutorialspoint.com/c_standard_library/c_function_gets.htm

Eu percebo que uses para limitar o número de caracteres de input. Mas tens outras formas de o fazer

depois, "bi = pede_bi(&bi);"

eu acho isso grande asneira. Não sou mestre em ponteiro, mas algo me diz que só um "pede_bi(bi);" deve funcionar

Link to comment
Share on other sites

Imprime o valor de bi algures no teu codigo para ver onde está o erro. Tipo isso

void inscrever_triagem(paciente triagem, char *bi, char nome[MAX], Data *d1){
   printf("bi - triagem : %s\n", bi);
   paciente aux;

assim já ficas a saber se o bi está a chegar bem a função e o problema é dentro dela, ou se o problema é antes. Não estou a conseguir ver assim nada de especifico

Link to comment
Share on other sites

Porque mais à frente no projeto vou precisar de ter acesso aos pacientes, acesso este que tem que ser feito por BI, dai ter alocado dinamicamente :s

o que acabaste de dizer não explica a razão de alocares dinamicamente a memória ao contrário de outros campos da estrutura ...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

os números são normalmente com 8 dígitos, mas não existe essa limitação. o que quer dizer que e for necessário o IRN pode aumentar o número de dígitos necessários.

além disso, quantos caracteres necessitas para guardar uma c-style string com 8 dígitos ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.