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

Hora del sistema

Estas en el tema de Hora del sistema en el foro de C/C++ en Foros del Web. Hola, necesito ayuda en el siguiente programa, bueno hice un programa con un menu de 2 opciones, la opcion 1 entra ve la hora del ...
  #1 (permalink)  
Antiguo 31/07/2011, 16:13
Avatar de baker1562  
Fecha de Ingreso: marzo-2011
Ubicación: Puntarenas
Mensajes: 261
Antigüedad: 13 años, 1 mes
Puntos: 9
Pregunta Hora del sistema

Hola, necesito ayuda en el siguiente programa, bueno hice un programa con un menu de 2 opciones, la opcion 1 entra ve la hora del sistema y la guarda en un arreglo, y la opcion 2 muestra las horas guardadas, mi problema es que siempre se guarda la misma hora, y no se porque, lo que quiero es que guarde las diferentes horas que le entra y no se cual es mi error, apreciaria que alguien me echara una mano

Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     const char *Fecha[3];
  10.     int opcion;
  11.     int i=0;
  12.     int controlador;
  13.     string respuesta;
  14.    
  15.     while(respuesta!="N" && respuesta!="n")
  16.     {
  17.    
  18.     cout<<"Presione 1 para entrar!!!"<<endl;
  19.     cout<<"Presione 2 para mostrar!!!"<<endl;
  20.     cin>>opcion;
  21.    
  22.     time_t tAct=time(NULL);
  23.    
  24.     system("cls");
  25.    
  26.     switch(opcion)
  27.     {
  28.    
  29.     case 1:
  30.          
  31.          
  32.          cout<<"Hora del sistema:"<<endl;
  33.          cout<<asctime(localtime(&tAct));
  34.          Fecha[i]=asctime(localtime(&tAct));
  35.          controlador=i;
  36.          i++;
  37.          cout<<endl;
  38.          
  39.          system("pause");
  40.          
  41.          
  42.          
  43.     break;
  44.    
  45.     case 2:
  46.          
  47.          for(int i=0;i<(controlador+1);i++)
  48.          {
  49.                  cout<<"Fechas"<<setw(10)<<Fecha[i]<<endl;
  50.                  cout<<endl;
  51.                  
  52.                  
  53.                  }
  54.                  
  55.          system("pause");
  56.          
  57.     break;
  58. }
  59.     cout<<"Desea realizar una nueva accion: s/n?"<<endl;
  60.     cin>>respuesta;
  61.    
  62.     system("cls");
  63.    
  64. }
  65.     return 0;
  66.    
  67. }
  #2 (permalink)  
Antiguo 31/07/2011, 17:58
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hora del sistema

Te recomiendo guardar la varaible time_t y no la cadena de caractes. Si guardas el time_t a la hora de mostrar los datos puede cambiar el formato rapidamentes. De la otra forma no.

Ademas no se como trabaja las funciones esas del tiempo. Pero imagino que el string que te estan devolviendo es statico. Eso quiere decir que el puntero que devuelven siempre apunta al mismo lado. Asi que el segundo llamado pisa al primero.
Aviso esta es una suposicion mia. Saludos

Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     const char *Fecha[3];
  10.     time_t fechas[3];
  11.     int opcion;
  12.     int i=0;
  13.     int controlador;
  14.     string respuesta;
  15.    
  16.     while(respuesta!="N" && respuesta!="n")
  17.     {
  18.    
  19.     cout<<"Presione 1 para entrar!!!"<<endl;
  20.     cout<<"Presione 2 para mostrar!!!"<<endl;
  21.     cin>>opcion;
  22.    
  23.     time_t tAct=time(NULL);
  24.    
  25.  
  26.    
  27.     switch(opcion)
  28.     {
  29.    
  30.     case 1:
  31.          
  32.          
  33.          cout<<"Hora del sistema:"<<endl;
  34.          cout<<asctime(localtime(&tAct));
  35.          fechas[i] = tAct;
  36.          controlador=i;
  37.          i++;
  38.          cout<<endl;
  39.          
  40.  
  41.          
  42.          
  43.          
  44.     break;
  45.    
  46.     case 2:
  47.          
  48.          for(int i=0;i<(controlador+1);i++)
  49.          {
  50.                  cout<<"Fechas"<<setw(10)<<asctime(localtime(&fechas[i]))<<endl;
  51.                  cout<<endl;
  52.                  
  53.                  
  54.                  }
  55.                  
  56.  
  57.          
  58.     break;
  59. }
  60.     cout<<"Desea realizar una nueva accion: s/n?"<<endl;
  61.     cin>>respuesta;
  62.    
  63.  
  64.    
  65. }
  66.     return 0;
  67.    
  68. }

Hice la prueba de imprimir el puntero y efectivamente en dos llamados distintos el valor del puntero devuelto es el mismo asi que el segundo llamado te esta pisando al primero.

Si quieres manejar igualmente con cadenas deberias copiarla a un string o un array de caracteres.
  #3 (permalink)  
Antiguo 31/07/2011, 18:09
Avatar de baker1562  
Fecha de Ingreso: marzo-2011
Ubicación: Puntarenas
Mensajes: 261
Antigüedad: 13 años, 1 mes
Puntos: 9
Respuesta: Hora del sistema

Cita:
Iniciado por sam90 Ver Mensaje
Te recomiendo guardar la varaible time_t y no la cadena de caractes. Si guardas el time_t a la hora de mostrar los datos puede cambiar el formato rapidamentes. De la otra forma no.

Ademas no se como trabaja las funciones esas del tiempo. Pero imagino que el string que te estan devolviendo es statico. Eso quiere decir que el puntero que devuelven siempre apunta al mismo lado. Asi que el segundo llamado pisa al primero.
Aviso esta es una suposicion mia. Saludos

Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     const char *Fecha[3];
  10.     time_t fechas[3];
  11.     int opcion;
  12.     int i=0;
  13.     int controlador;
  14.     string respuesta;
  15.    
  16.     while(respuesta!="N" && respuesta!="n")
  17.     {
  18.    
  19.     cout<<"Presione 1 para entrar!!!"<<endl;
  20.     cout<<"Presione 2 para mostrar!!!"<<endl;
  21.     cin>>opcion;
  22.    
  23.     time_t tAct=time(NULL);
  24.    
  25.  
  26.    
  27.     switch(opcion)
  28.     {
  29.    
  30.     case 1:
  31.          
  32.          
  33.          cout<<"Hora del sistema:"<<endl;
  34.          cout<<asctime(localtime(&tAct));
  35.          fechas[i] = tAct;
  36.          controlador=i;
  37.          i++;
  38.          cout<<endl;
  39.          
  40.  
  41.          
  42.          
  43.          
  44.     break;
  45.    
  46.     case 2:
  47.          
  48.          for(int i=0;i<(controlador+1);i++)
  49.          {
  50.                  cout<<"Fechas"<<setw(10)<<asctime(localtime(&fechas[i]))<<endl;
  51.                  cout<<endl;
  52.                  
  53.                  
  54.                  }
  55.                  
  56.  
  57.          
  58.     break;
  59. }
  60.     cout<<"Desea realizar una nueva accion: s/n?"<<endl;
  61.     cin>>respuesta;
  62.    
  63.  
  64.    
  65. }
  66.     return 0;
  67.    
  68. }

Hice la prueba de imprimir el puntero y efectivamente en dos llamados distintos el valor del puntero devuelto es el mismo asi que el segundo llamado te esta pisando al primero.

Si quieres manejar igualmente con cadenas deberias copiarla a un string o un array de caracteres.
grax me sirvio eso era lo ue queria aunque me quedaron dudas de porque se guarda tAct y no asctime(localtime(&tAct))
  #4 (permalink)  
Antiguo 31/07/2011, 18:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Hora del sistema

Puedes guardar asctime(localtime(&tAct)) pero tienes que copiar su contenido a otro lado porque en el proximo llamado se modifica la memoria donde estaba el resultado previo.

Tienes ideas sobre punteros?? Esta funcion se reserva un pedazo de memoria para ella. Cuando la llamas escribe en esa memoria y te devuelve la direccion de la memoria. Cuando vuelves a llamar a la misma funcion escribe sobre este mismo lugar. Asi que cuando buscas la direccion que tenias antes fue modificado por el ultimo llamado.
  #5 (permalink)  
Antiguo 31/07/2011, 21:17
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Hora del sistema

Exactamente. sam90 tiene la boca llena de razon hehe. Básicamente lo que te estas copiando es la dirección de memoria. En lugar de utilizar una asignación directa, utiliza un strcopy o algo opr el estílo. Además te falta realizar la reserva de memoria, ya que solo estas reservando el espacio de memoria para almacenar los punteros, pero te falta reservar memoria para los datos.

Salu2, espero te sea de ayuda.
  #6 (permalink)  
Antiguo 31/07/2011, 22:21
Avatar de baker1562  
Fecha de Ingreso: marzo-2011
Ubicación: Puntarenas
Mensajes: 261
Antigüedad: 13 años, 1 mes
Puntos: 9
Respuesta: Hora del sistema

Cita:
Iniciado por Trovaz Ver Mensaje
Exactamente. sam90 tiene la boca llena de razon hehe. Básicamente lo que te estas copiando es la dirección de memoria. En lugar de utilizar una asignación directa, utiliza un strcopy o algo opr el estílo. Además te falta realizar la reserva de memoria, ya que solo estas reservando el espacio de memoria para almacenar los punteros, pero te falta reservar memoria para los datos.

Salu2, espero te sea de ayuda.

grax, si solo estaba el puntero no la variable a la cual apuntaba

Etiquetas: horas
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 12:20.