Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problemas funciones obtención hora y fecha local

Estas en el tema de Problemas funciones obtención hora y fecha local en el foro de C/C++ en Foros del Web. Hola a todos, Estoy teniendo problemas con las funciones time y localtime para obtener la hora local. En el siguiente ejemplo que muestro intento obtener ...
  #1 (permalink)  
Antiguo 25/12/2013, 17:16
 
Fecha de Ingreso: diciembre-2013
Mensajes: 2
Antigüedad: 10 años, 3 meses
Puntos: 0
Problemas funciones obtención hora y fecha local

Hola a todos,

Estoy teniendo problemas con las funciones time y localtime para obtener la hora local. En el siguiente ejemplo que muestro intento obtener dos fechas diferentes con un delay de 5 seg entre ellas, usando variables independientes.
Antes de obtener la segunda fecha imprimo también en pantalla la primera para la comprobación.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <windows.h>
  4.  
  5. #define TFECHA 30
  6.  
  7. int main ()
  8.   {
  9.   time_t t1,t2;
  10.   struct tm *tinfo1, *tinfo2;
  11.   char f1[TFECHA],f2[TFECHA];
  12.  
  13.   time(&t1);
  14.   tinfo1=localtime(&t1);
  15.   strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo1);
  16.   printf("%s\n", f1);
  17.  
  18.   Sleep(5000);
  19.  
  20.   time(&t2);
  21.   tinfo2=localtime(&t2);
  22.  
  23.   strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo1);
  24.   strftime(f2, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo2);
  25.   printf("%s\n%s", f1,f2);
  26.  
  27.   return 0;
  28.   }


Sin embargo al imprimir al final las dos últimas fechas, los valores que se obtienen son exactamente iguales. No entiendo por qué al ejecutar tinfo2=localtime(&t2) (linea 21) la estructura t1 también se ve alterada...

La salida que obtengo es:

Código:
25/12/2013 23:54:14
25/12/2013 23:54:19
25/12/2013 23:54:19
Si alguien pudiera aclarármelo se lo agradecería.

Saludos.
  #2 (permalink)  
Antiguo 27/12/2013, 09:15
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Problemas funciones obtención hora y fecha local

no son *tinfo1, *tinfo2; punteros a una misma estructura: "tm"?
Me da la impresión que imprimes lo mismo pero con diferentes punteros XD
En todo caso seria
struct tm1 *tinfo1;
struct tm2 *tinfo2;

envés de: struct tm *tinfo1, *tinfo2;

Usas la misma estructura para guardar ambas fechas?

Digo que es lo que me parece, no estoy seguro XDD
  #3 (permalink)  
Antiguo 27/12/2013, 11:53
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 7 meses
Puntos: 83
Respuesta: Problemas funciones obtención hora y fecha local

@vangodp: 'struct tm' es una estructura estandar definida en time.h, pero tienes razon: usa dos punteros sobre una misma cosa.

El problema está en que la funcion 'localtime' escribe sobre una unica estructura interna a la libreria, pero solo te retorna un puntero a esa estructura. Para que se vea mejor puedes cambiar los nombres de las variables:

Código C:
Ver original
  1. time_t t1,t2;
  2. struct tm *puntero1;
  3. struct tm *puntero2;
  4.  
  5. time(&t1);
  6. puntero1 = localtime(&t1);//guardas en una estructura interna unica y recibes el puntero
  7.  
  8. time(&t2);
  9. puntero2 = localtime(&t2);//sobreescribes la estructura interna y recibes el puntero

Ambos punteros apuntan a una misma estructura, cuya direccion es constante para esta instancia de la aplicacion, eso significa que puntero1 apunta al mismo sitio que puntero2, o traducido a tu codigo significa que tinfo1 es lo mismo que tinfo2 despues de que ejecutes el segundo localtime.

Supongo que quieres calcular el tiempo de ejecucion. Puedes solucionarlo de dos formas: o bien creas un struct tm y copias literalmente el retorno de localtime, o usas los timestamps. Normalmente se usan los timestamps. Un ejemplo con las estructuras:

Código C:
Ver original
  1. time_t t1,t2;
  2. struct tm *ptr1, *ptr2;
  3. struct tm tinfo1, tinfo2;
  4. char f1[TFECHA],f2[TFECHA];
  5.  
  6. time(&t1);
  7. ptr1 = localtime(&t1);
  8. memcpy(&tinfo1, ptr1, sizeof(struct tm));
  9.  
  10. strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo1);
  11. printf("%s\n", f1);
  12.  
  13. Sleep(5000);
  14.  
  15. time(&t2);
  16. ptr2 = localtime(&t2);
  17. memcpy(&tinfo2, ptr2, sizeof(struct tm));
  18.  
  19. strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo1);
  20. strftime(f2, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo2);
  21. printf("%s\n%s", f1,f2);

Y ahora uno con los timestamps:

Código C:
Ver original
  1. clock_t t1, t2;
  2.  
  3. printf("Entre ahora... ");
  4. t1 = clock();
  5.  
  6. Sleep(5000);
  7. printf("y ahora han pasado ");
  8.  
  9. t2 = clock() - t1;
  10. printf("%f segundos\n", ((float)t2) / CLOCKS_PER_SEC);

Una ultima cosa: cuando usas una libreria donde alguna funcion te retorna un puntero tienes que prever dos cosas. La primera, que puede haber en esa libreria una funcion para liberar la posible memoria bloqueda para el puntero. La segunda, que si no hay funciones de liberacion de memoria ni en la referencia de las funciones te indica que debes liberar la memoria entonces significa que ese puntero está apuntando a un sitio unico (o eso o la libreria está mal documentada, que tambien puede ser). En el caso de localtime te retorna un puntero pero no te dice que al finalizar su uso debes liberar la memoria: eso indica que te retorna un puntero a una direccion de memoria unica para la instancia de tu aplicacion, es decir que cada vez que llames a localtime se sobreescribirá esa direccion.

Este tipo de funciones se dice que no son thread-safe, es decir que no esperes que funcione cuando los uses en una aplicacion en multiprocesos sin semaforos o zonas criticas (ya se que el codigo que colgaste no es multithread, ahí funciona pero funciona mal). Te gustará saber que tambien la funcion strtok es de ese tipo.

Saludos
vosk

Última edición por vosk; 27/12/2013 a las 12:06
  #4 (permalink)  
Antiguo 27/12/2013, 17:41
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Problemas funciones obtención hora y fecha local

Bien..pues ya sabemos algo mas :D
Saludos vosk.
  #5 (permalink)  
Antiguo 31/07/2014, 14:07
 
Fecha de Ingreso: diciembre-2013
Mensajes: 2
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Problemas funciones obtención hora y fecha local

Aunque haya pasado algo de tiempo, muchas gracias a ambos, especialmente a vosk por tu genial explicación.
Saludos

Etiquetas: fecha, funcion, funciones, int, local, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:10.