Controle de estacionamento

1. Controle de estacionamento

Yan Martins
yanmartins

(usa Outra)

Enviado em 09/12/2016 - 09:00h

Boa tarde,

Eu tenho um projeto onde devo fazer um estacionamento em C.
O programa precisa coletar placa do veículo e data e hora do sistema.
Usando o código abaixo eu não consigo coletar a data e hora de entrada e saída. O arquivo não compila.
Só consigo compilar um código onde só coleta entrada ou só coleta saída, ambos ao mesmo tempo não consigo.
Alguém sabe me dizer o que devo fazer?

#include <stdio.h>
#include <time.h>

// funcao format. Ela recebe um valor do tipo inteiro e caso este seja menor que 10
// ela inclui o 0 na frente. ex.: 1 antes 01 depois
// for fim retorna um ponteiro para uma variavel do tipo char com o valor da conversao
char *format(int number){
char *retorno,
ret[100];
int i;

if (number < 10){
sprintf(ret,"0%d",number);
retorno = ret;
return retorno;
}
else{
sprintf(ret,"%d",number);
retorno = ret;
return retorno;
}
}

// funcao que retorna data
char *data(void){

int dia,mes,ano;
char var1[100],
var2[100],
var3[100],
var4[100],
*dataPtr;
struct tm *local;
time_t t;

t = time(NULL);
local = localtime(&t);

dia = local -> tm_mday;
mes = local -> tm_mon + 1;
ano = local -> tm_year + 1900;

// por algum motivo precisa converter os valores retornados pelos ponteiros
// da funcao em variaveis do tipo char
sprintf(var1,"%s",format(dia));
sprintf(var2,"%s",format(mes));
sprintf(var3,"%s",format(ano));

// cria a variavel de retorno dos dados e cria um ponteiro para essa variavel
sprintf(var4,"%s/%s/%s",var1,var2,var3);

// retorna data no formato dd:MM:yyyy com um ponteiro
dataPtr = var4;
return dataPtr;
}

// funcao que retorna hora
char *hora(void){

int hora,minuto,segundo;
char var1[100],
var2[100],
var3[100],
var5[100],
*retorno;


struct tm *local;
time_t t;

t = time(NULL);
local = localtime(&t);

// obtem hora, minuto e segundo e os aloca em uma variavel do tipo inteiro
hora = local -> tm_hour;
minuto = local -> tm_min;

// por algum motivo precisa converter os valores retornados pelos ponteiros
// da funcao em variaveis do tipo char
sprintf(var1,"%s",format(hora));
sprintf(var2,"%s",format(minuto));

// cria a variavel de retorno dos dados e cria um ponteiro para essa variavel
sprintf(var5,"%s:%s",var1,var2);

// retorna hora no formato hh:mm:ss com um ponteiro
retorno = var5;
return retorno;
}

int main()
{
char data_sistema[100],
hora_sistema[100];

sprintf(data_sistema,"%s",data());
sprintf(hora_sistema,"%s",hora());

printf("%s\n",data_sistema);
printf("%s\n",hora_sistema);

}



  


2. Re: Controle de estacionamento

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/12/2016 - 10:41h

yanmartins escreveu:

Boa tarde,

Eu tenho um projeto onde devo fazer um estacionamento em C.
O programa precisa coletar placa do veículo e data e hora do sistema.
Usando o código abaixo eu não consigo coletar a data e hora de entrada e saída. O arquivo não compila.
Só consigo compilar um código onde só coleta entrada ou só coleta saída, ambos ao mesmo tempo não consigo.
Alguém sabe me dizer o que devo fazer?

#include <stdio.h>
#include <time.h>

// funcao format. Ela recebe um valor do tipo inteiro e caso este seja menor que 10
// ela inclui o 0 na frente. ex.: 1 antes 01 depois
// for fim retorna um ponteiro para uma variavel do tipo char com o valor da conversao
char *format(int number){
char *retorno,
ret[100];


Aqui você declarou ret como um dado local de função com armazenamento automático. Isso significa que ele deixa de existir como dado válido quando a função retorna. Guarde essa informação.

   int    i;

if (number < 10){
sprintf(ret,"0%d",number);
retorno = ret;
return retorno;


E aqui você retornou um ponteiro para um dado local que deixa de existir como dado válido como decorrência do próprio comando de retorno.

Percebeu o problema? Se você tentar acesso ao ponteiro retornado pela função, ele estará apontando para uma região de memória que é inválida. Qualquer coisa pode acontecer quando você tentar acesso aos dados: você pode dar o AZAR (algumas pessoas diriam que é sorte, mas não eu) de o dado que lhe interessa ainda estar lá (digo que é azar porque um erro formal no seu programa ficaria sem ser detectado), mas também pode pegar lixo (se a região de memória já tiver sido reaproveitada para outra finalidade), e pode até mesmo fazer com que o programa capote (se, por exemplo, a implementação devolver ao sistema operacional aquela memória da qual já não precisa mais).

   }
else{
sprintf(ret,"%d",number);
retorno = ret;
return retorno;
}
}


Toda a função acima é desnecessária. No fim das contas, você conseguiria o mesmo efeito com algo parecido com o seguinte.

snprintf(buffer, buffer_size, "%02d", number) 


// funcao que retorna data
char *data(void){

int dia,mes,ano;
char var1[100],
var2[100],
var3[100],
var4[100],
*dataPtr;
struct tm *local;
time_t t;

t = time(NULL);
local = localtime(&t);

dia = local -> tm_mday;
mes = local -> tm_mon + 1;
ano = local -> tm_year + 1900;

// por algum motivo precisa converter os valores retornados pelos ponteiros
// da funcao em variaveis do tipo char
sprintf(var1,"%s",format(dia));
sprintf(var2,"%s",format(mes));
sprintf(var3,"%s",format(ano));

// cria a variavel de retorno dos dados e cria um ponteiro para essa variavel
sprintf(var4,"%s/%s/%s",var1,var2,var3);

// retorna data no formato dd:MM:yyyy com um ponteiro
dataPtr = var4;
return dataPtr;


De novo você comete o erro de retornar um ponteiro para um dado que deixa de ter existência válida após o retorno da função.


}


Também a função acima é pouco útil. Já existe uma função na biblioteca padrão para formatar dados de data e hora, chamada strftime(). Se o seu exercício não exigir que você implemente sua própria função do formatação, use aquela que o sistema já lhe oferece naturalmente.

// funcao que retorna hora
char *hora(void){

int hora,minuto,segundo;
char var1[100],
var2[100],
var3[100],
var5[100],
*retorno;


struct tm *local;
time_t t;

t = time(NULL);
local = localtime(&t);

// obtem hora, minuto e segundo e os aloca em uma variavel do tipo inteiro
hora = local -> tm_hour;
minuto = local -> tm_min;

// por algum motivo precisa converter os valores retornados pelos ponteiros
// da funcao em variaveis do tipo char
sprintf(var1,"%s",format(hora));
sprintf(var2,"%s",format(minuto));

// cria a variavel de retorno dos dados e cria um ponteiro para essa variavel
sprintf(var5,"%s:%s",var1,var2);

// retorna hora no formato hh:mm:ss com um ponteiro
retorno = var5;
return retorno;
}


De novo, aqui se aplica todos os comentários feitos a respeito da função que formata a data.


int main()
{
char data_sistema[100],
hora_sistema[100];

sprintf(data_sistema,"%s",data());
sprintf(hora_sistema,"%s",hora());

printf("%s\n",data_sistema);
printf("%s\n",hora_sistema);

}


Se você suprimir as funções desnecessárias, seu programa principal fica reduzido ao seguinte.

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void){ // Esse “void” é importante se você estiver usando C (em C++ ele poderia ser omitido).
time_t now;
struct tm tm_now, *p_tm_now;
char str_time[100];
char str_date[100];

now=time(NULL);
p_tm_now=localtime(&now);
if(!p_tm_now){
fprintf(stderr, "Erro ao converter hora para representação fragmentada: %s.\n", strerror(errno));
return 1;
}
tm_now=*p_tm_now;

if(strftime(str_date, sizeof str_date, "%Y/%m/%d", &tm_now)<0){ // formato “yyyy/mm/dd”.
fprintf(stderr, "Erro na conversão da data para string (buffer muito pequeno?).\n");
return 1;
}
if(strftime(str_time, sizeof str_time, "%H:%M:%S", &tm_now)<0){ // formato “hh:mm:dd”.
fprintf(stderr, "Erro na conversão da hora para string (buffer muito pequeno?).\n");
return 1;
}

printf("%s %s\n", str_date, str_time);

return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts