PCaseiro Posted April 27, 2015 at 07:45 PM Report Share #581977 Posted April 27, 2015 at 07:45 PM (edited) 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 April 27, 2015 at 09:01 PM by apocsantos geshi Link to comment Share on other sites More sharing options...
Bernardo Vieira Posted April 27, 2015 at 08:15 PM Report Share #581980 Posted April 27, 2015 at 08:15 PM 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 More sharing options...
PCaseiro Posted April 27, 2015 at 08:18 PM Author Report Share #581981 Posted April 27, 2015 at 08:18 PM Obrigado pela resposta, mas acho que não vou usar gets por questões de segurança. Quanto à parte de fazer apenas pede_bi(&bi) experimentei e também não resultou :/ Link to comment Share on other sites More sharing options...
Bernardo Vieira Posted April 27, 2015 at 08:27 PM Report Share #581982 Posted April 27, 2015 at 08:27 PM 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 More sharing options...
HappyHippyHippo Posted April 27, 2015 at 08:46 PM Report Share #581985 Posted April 27, 2015 at 08:46 PM Quantas mensagens de errors do compilador te sao apresentadas? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 09:02 PM Author Report Share #581988 Posted April 27, 2015 at 09:02 PM no fgets dá-me warning de compilador ao dizer que está à espera de char * mas o argumento is of type char ** outro bug, insiro uma vez os dados de um paciente e ele aceita. insiro para outro doente e diz sempre bi inválido, é de não fazer free? Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 09:39 PM Author Report Share #581998 Posted April 27, 2015 at 09:39 PM Penso que consegui. Na chamada à função tenho só pede_bi(&bi); e na função pede_bi tenho fgets(bi,MAX,stdin) Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 27, 2015 at 10:23 PM Report Share #582002 Posted April 27, 2015 at 10:23 PM responde só a esta questão : porque estás a alocar memória para esse valor já que não o fazes para mais nenhum ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 10:47 PM Author Report Share #582007 Posted April 27, 2015 at 10:47 PM responde só a esta questão : porque estás a alocar memória para esse valor já que não o fazes para mais nenhum ? 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 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 27, 2015 at 10:49 PM Report Share #582008 Posted April 27, 2015 at 10:49 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 10:52 PM Author Report Share #582011 Posted April 27, 2015 at 10:52 PM 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 ... Realmente, eu até sei o tamanho do BI (8 digitos) por isso penso que não vale a pena alocar dinamicamente, certo? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 27, 2015 at 10:53 PM Report Share #582012 Posted April 27, 2015 at 10:53 PM além do BI poder ter mais do que 8 dígitos, não, não é necessário estar a complicar ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 11:05 PM Author Report Share #582016 Posted April 27, 2015 at 11:05 PM O BI não tem de ter obrigatoriamente 8 digitos? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 27, 2015 at 11:16 PM Report Share #582017 Posted April 27, 2015 at 11:16 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 11:19 PM Author Report Share #582018 Posted April 27, 2015 at 11:19 PM 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 ? 9? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 27, 2015 at 11:22 PM Report Share #582019 Posted April 27, 2015 at 11:22 PM 9? yep IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
PCaseiro Posted April 27, 2015 at 11:24 PM Author Report Share #582020 Posted April 27, 2015 at 11:24 PM yep Hoje já não vou ter tempo, mas amanhã vou seguir o teu conselho e remover a alocação dinâmica! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now