Autor
|
Tema: time() localtime() (Leído 2,604 veces)
|
soyloqbuskas
Desconectado
Mensajes: 218
¡El conocimiento es de todos!
|
Buenas a todos! tengo un problema con esta funcion...me da fallo de segmentacion en la funcion localtime() char * getDateTime(){ char * fecha =(char*)malloc(200); char * dia=""; char * mes=""; switch(tm->tm_wday){ case 0: dia="Sun"; break; case 1: dia="Mon"; break; case 2: dia="Tue"; break; case 3: dia="Wed"; break; case 4: dia="Thu"; break; case 5: dia="Fri"; break; case 6: dia="Sat"; break; default: dia="???"; break; } switch(tm->tm_mon){ case 0: mes="Jan"; break; case 1: mes="Feb"; break; case 2: mes="Mar"; break; case 3: mes="Apr"; break; case 4: mes="May"; break; case 5: mes="Jun"; break; case 6: mes="Jul"; break; case 7: mes="Aug"; break; case 8: mes="Sep"; break; case 9: mes="Oct"; break; case 10: mes="Nov"; break; case 11: mes="Dec"; break; default: mes="???"; break; } sprintf(fecha ,"Date: %s , %d %s %d %d:%d:%d GMT",dia , tm ->tm_mday , mes , tm ->tm_year +1900, tm ->tm_hour , tm ->tm_min , tm ->tm_sec ); return fecha; }
¿Por que me da fallo de segmentacion? Gracias, un saludo
|
|
|
En línea
|
"Si tienes 1 manzana y yo tengo otra manzana... y las intercambiamos, ambos seguiremos teniendo 1 manzana. Pero...si tu tienes 1 idea y yo tengo otra idea... y las intercambiamos, ambos tendremos 2 ideas."
George Bernard Shaw
|
|
|
ecfisa
Desconectado
Mensajes: 114
|
Hola soyloqbuskas. No sé con que compilador estes trabajando, pero probé tu código en CodeBlocks (GNU GCC Compiler) y en Builder C++ 6 y en ambos funciona sin provocar error alguno. Pero de ese modo se te presenta el problema de como liberar la memoria asignada con malloc a la variable local fecha. Quizá sería mejor: #include <stdio.h> #include <stdlib.h> #include <time.h> void getDateTime(char **fecha) { char *dia = ""; char *mes = ""; switch(tm->tm_wday){ case 0: dia="Sun"; break; case 1: dia="Mon"; break; case 2: dia="Tue"; break; case 3: dia="Wed"; break; case 4: dia="Thu"; break; case 5: dia="Fri"; break; case 6: dia="Sat"; break; default: dia="???"; break; } switch(tm->tm_mon){ case 0: mes="Jan"; break; case 1: mes="Feb"; break; case 2: mes="Mar"; break; case 3: mes="Apr"; break; case 4: mes="May"; break; case 5: mes="Jun"; break; case 6: mes="Jul"; break; case 7: mes="Aug"; break; case 8: mes="Sep"; break; case 9: mes="Oct"; break; case 10: mes="Nov"; break; case 11: mes="Dec"; break; default: mes="???"; break; } sprintf(*fecha ,"Date: %s , %d %s %d %d:%d:%d GMT",dia , tm ->tm_mday , mes , tm ->tm_year +1900, tm ->tm_hour , tm ->tm_min , tm ->tm_sec ); } int main() { char *fecha =(char*)malloc(200); getDateTime(&fecha); ... }
Saludos.
|
|
|
En línea
|
|
|
|
BatchianoISpyxolo
Desconectado
Mensajes: 166
|
Sep, En CodeBlocks con el GCC funciona aunque hay que liberar la memoria de fecha xD
Compilando con gcc desde consola te debería de ir igual :]
|
|
|
En línea
|
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
Te da fallo de segmentación por los punteros dia y mes. Los inicias a vacío y luego modificas su tamaño, sobreescribiendo datos de la pila que pueden afectar a otras variables. Falle a veces porque depende los datos que haya en la pila y si llega a afectar al segmento de datos es cuando rompe el programa.
La solución es declarar un array de 4 caracteres y no te complicas. Otra cosa: no te olvides de hacer un free después de llamar a getDateTime, porque produce un Memory Leak.
Saludos.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Te da fallo de segmentación por los punteros dia y mes. Los inicias a vacío y luego modificas su tamaño, sobreescribiendo datos de la pila que pueden afectar a otras variables. No hay problema en la forma en que soyloqbuskas utiliza los punteros "mes" y "dia": char *dia = ""; /* ... */ case 0: dia = "Sun"; break; case 1: dia = "Mon"; break;
Ya que en cada una de esas asignaciones solo almacena en la variable "dia" una nueva dirección de memoria: la dirección donde se almacena la cadena literal. En cuanto a la función para formatear la fecha no es necesario hacerlo manualmente, en su lugar se puede utilizar la función strftime (prototipo en <time.h>), por ejemplo (sin validación de errores): #include <stdio.h> #include <stdlib.h> #include <time.h> char *getDateTime(void); int main (void) { char *fecha; fecha = getDateTime(); return EXIT_SUCCESS; } char *getDateTime(void) { size_t nc; nc = strftime(cad , 1024, "Date: %a, %d %b %Y %H:%M:%S %Z", tm ); return cad; }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Run-Time Error 339
Programación Visual Basic
|
NYlOn
|
2
|
1,881
|
2 Septiembre 2005, 03:45 am
por NYlOn
|
|
|
time adjuster
Multimedia
|
pardo
|
1
|
1,720
|
9 Febrero 2006, 18:03 pm
por arda-lothi
|
|
|
Red Time 2.2
Programación Visual Basic
|
Red Mx
|
1
|
1,790
|
2 Junio 2006, 20:47 pm
por rubeng
|
|
|
[SOLUCIONADO] My.Computer.Clock.LocalTime.DayOfWeek
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
2
|
2,016
|
12 Enero 2013, 22:28 pm
por Eleкtro
|
|