Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eferion

#371
Cita de: patilanz en 18 Junio 2014, 13:22 PM
eferion no sabia que windows guarda el tiempo. Lo he encontrado en el registro pero no entiendo tu funciona de convertir el FILETIME. Me la puedes explicar ?

¿No lo entiendes o no funciona?

Si la opción buena es que no entiendes el código, tienes que saber que:


  • FILETIME indica el tiempo que ha pasado desde el 1 de Enero de 1601 en intervalos de 100 nanosegundos.
  • time_t indica el tiempo que ha pasado desde el 1 de Enero de 1970 en intervalos de 1 segundo.

Lo que hace al función es realizar la conversión entre estas dos escalas de tiempo (se asume que la fecha de apagado que va a figurar en el registro no es anterior a 1970 ;))

Cita de: patilanz en 18 Junio 2014, 13:22 PM
Y una cosa mas, si el pc se apaga inesperadamente por ejemplo si se queda sin corriente windows lo guarda correctamente?

Si se va la corriente no hay sistema sin batería que te vaya a registrar la hora exacta en la que ésto ha sucedido... y Windows no es una excepción. Lo que sucede es que tener una aplicación residente actualizando un registro en disco para poder saber en qué momento se ha ido la luz es algo cuanto menos extraño.

Este caso, desde mi punto de vista, se debería tratar de otra manera: Le acoplas un SAI al pc, conectas el cable de datos del SAI al pc y lo configuras para que el PC se apague automáticamente cuando el flujo eléctrico falle.
#372
Y no es más sencillo leer la fecha y hora en la que se ha apagado el equipo??

HKLM\System\CurrentControlSet\Control\Windows -> ShutdownTime

La clave está en formato FILETIME. Puedes convertirlo a formato time_t con una función tal que:

Código (cpp) [Seleccionar]

time_t filetimeToTimet(FILETIME *ft)
{
 ULARGE_INTEGER ull;
 ull.LowPart = ft->dwLowDateTime;
 ull.HighPart = ft->dwHighDateTime;
 return ull.QuadPart / 10000000ULL - 11644473600ULL;
}
#373
"recolectar" puede tener, básicamente, dos versiones diferentes:


  • Recibe la fecha de recolección y la cantidad recolectada
  • Recibe un puntero de tipo "cultivo"

Si optas por la primera opción, la fecha de recolección debe ser de tipo "fecha" ya que es el tipo que empleas para almacenar las fechas. Además, dado que pretendes modificarlo dentro de la función, debería ser un puntero. Además, presupongo que la "cantidad recolectada" debería inicializarse a 0 una vez has recolectado, cierto? en tal caso este parámetro también debería ser un puntero.

Si optas por la segunda opción, la función únicamente recibirá un parámetro que, por ser puntero, te permitirá modificar su contenido alegremente sin problemas.

Versión 1:

void recolectar ( fecha* recfecha, float* cantidadr);

Versión 2:

void recolectar( cultivo* datoscultivo );

El contenido de la función imagino que sabrás adaptarlo correctamente.

Un saludo.
#374
hasta el momento no he tenido que montar nunca el conector de mysql, no creo que te pueda ayudar dándote una serie de pasos concretos para montar la librería en Windows.

Lo siento.
#375
std::string es una clase que gestiona cadenas de caracteres... no es una cadena de caracteres. Internamente, la clase string utiliza un puntero para almacenar la cadena de caracteres. Si tu almacenas en el fichero las posiciones de memoria utilizadas por "Usuario" de forma literal, estarás guardando en el disco el valor del puntero, es decir, la posición de memoria a la que apunta. Al recuperar la información del disco, recuperas el valor de la posición de memoria... pero en esa memoria no vas a encontrar información útil... es basura.

Lo que tienes que hacer es guardar los strings uno a uno:

Código (cpp) [Seleccionar]

bool Usuario::grabarPuntaje()
{
    FILE *u;
    u=fopen(RUTAPUNTAJES,"ab");
    if(u==NULL)
    {
        cout<<"ERROR CON EL ARCHIVO DE PUNTAJES."<<endl;
        return false;
    }
    fwrite( cadena.c_str( ), cadena.size( ),1,u );
    // falta guardar "nombre"
    fclose(u);
    return true;
}


Para recuperar la información, tampoco puedes machacar la posición de memoria de la clase, tienes que recuperar cada valor uno a uno y actualizar las variables según proceda.

PD.: El mecanismo que has puesto en tu código únicamente funcionará si ninguna de las clases implicadas hace uso de memoria dinámica; en caso contrario tendrás errores de lo más variopintos.
#376
Mi propuesta en C:


#include <stdio.h>

int main( void )
{
 int i, j;
 int flag = 0;
 char cadena[] = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 char cadena_final[ sizeof( cadena ) ] = {0};

 for ( i = 0, j = 0; cadena[i]; i++ )
 {
   flag ^= ( cadena[ i ] == '\'' );

   if ( flag  || cadena[ i ] != ' ' )
     cadena_final[ j++ ] = cadena[ i ];
 }
 printf ( "\n%s\n", cadena_final );
 return 0;
}


Mi propuesta en C++:

Código (cpp) [Seleccionar]

#include <string>
#include <iostream>

int main( )
{
 std::string cadena = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 std::string cadena_final;

 bool flag = false;
 for ( auto it = cadena.begin( ); it != cadena.end( ); ++it )
 {
    flag ^= ( *it == '\'' );

   if ( flag || *it != ' ' )
     cadena_final += *it;
 }

 std::cout << std::endl << cadena_final << std::endl;
}
#377
Cita de: Ahustinkrone en 17 Junio 2014, 01:48 AM
:/ no uso C++11, pero gracias igual.

Usas un compilador antiguo?? si usas uno mínimamente actualizado tienes la opción de usar, en el peor de los casos, algunas características de C++11 sin problemas.
#378
si no te reconoce instrucciones tipo mysql_init( ) es porque no estás enlazando con la librería.

Lo ideal es compilar primero la librería. Lo que suele suceder es que estas librerías arrastran dependencias (openssl para conexiones seguras, por ejemplo). Algunas de estas dependencias se pueden eliminar a costa de perder prestaciones, pero eso solo puedes hacerlo en el momento de compilar la librería.

Lo mismo las instrucciones de este enlace te sirven de ayuda.
#379
Entonces genial ;)
#380
Programación C/C++ / Re: ayuda con floyd
16 Junio 2014, 10:40 AM
Si evitas ciertos intentos de "optimizar" el algoritmo puedes acortar el código:

Código (cpp) [Seleccionar]

for ( int i = 0; i < N; i++ )
{
  for ( int j = 0; j < N; j++ )
  {
    for ( int k = 0; k < N; k++ )
    {
      int coste = path[j][i] + path[i][k];
      if ( path[j][k] > coste )
        path[j][k] = coste;
    }
  }
}