Podría alguien por favor me ayude a solucionar error de excepción no controlada cuando se utiliza visual C++ 2008? el error se muestra como sigue: excepción no Controlada en 0x00411690 en time.exe: 0xC0000005: infracción de Acceso de lectura ubicación 0x00000008

Algunos detalles:

– tm 0x00000000 {tm_sec=??? tm_min=??? tm_hour=??? …} tm *

tm_sec expresiones cxx0030: Error: Error de expresión no puede ser evaluado

De hecho cuando he usado visual c++ 6 en el pasado, no había ningún error y el programa se estaba ejecutando bien. Pero ahora ehen uso visual de 2008, estoy recibiendo este error de excepción no Controlada.

Aquí está el programa:

...
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag = 0;
if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
tmpres /= 10;  /*convert into microseconds*/
/*converting file time to unix epoch*/
tmpres -= DELTA_EPOCH_IN_MICROSECS; 
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
if (NULL != tz)
{
if (!tzflag)
{
_tzset();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}
return 0;
}
uint32_t stampstart()
{
struct timeval  tv;
struct timezone tz;
struct tm      *tm;
uint32_t         start;
gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
printf("TIMESTAMP-START\t  %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
tm->tm_min, tm->tm_sec, tv.tv_usec,
tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000);   /////---debugger stops here---
start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
tm->tm_sec * 1000 + tv.tv_usec / 1000;
return (start);
}

gracias por sus respuestas:

  • Utilizar el depurador de Visual Studio, paso en el código, y nos dicen que la excepción que ocurre…
  • En la línea que usted está recibiendo esta excepción…?
  • Gracias por las respuestas … ver la línea : tm->tm_sec * 1000 + tv.tv_usec / 1000); de uint32_t stampstart() función
  • el problema es que la variable » tv.tv_sec » devuelve un valor negativo. por qué? es allí alguna idea? gracias
  • echa un vistazo aquí: stackoverflow.com/questions/2494356/…
InformationsquelleAutor make | 2010-03-22

6 Comentarios

  1. 2

    Intente Algo como…

     tm = localtime(&tv.tv_sec);
    if(tm)
    {
    printf("TIMESTAMP-START\t  %d:%02d:%02d:%d (~%d ms)\n", tm->tm_hour,
    tm->tm_min, tm->tm_sec, tv.tv_usec,
    tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
    tm->tm_sec * 1000 + tv.tv_usec / 1000); 
    start = tm->tm_hour * 3600 * 1000 + tm->tm_min * 60 * 1000 +
    tm->tm_sec * 1000 + tv.tv_usec / 1000;
    }
    else
    {
    //failed to retrive local time
    }
    • gracias por la idea. sí! se produce un error recuperar hora local. Es allí idea sobre cómo resolver este problema? gracias de nuevo por tu ayuda
    • usted puede ver el valor exacto de problema…si localtime() no se establecerá el valor …
    • sí! es localtime como no devuelve anythink. en realidad no entiendo por qué funciona con VC++6 y no con VC++2008 …gracias!
  2. 1

    La infracción de acceso se refiere dirección 0x00000008, lo que probablemente significa que su código de acceso a un campo en el desplazamiento de 8 en una estructura a la que señala con un puntero NULL.
    Supongo que localtime devuelve un puntero NULO. Marque esta opción.

    • Probablemente, pero ¿por qué funciona con VC++6 y no con VC++2008? gracias por su respuesta!
  3. 1

    «Infracción de acceso de lectura ubicación 0x00000008»

    Una dirección que baja es probablemente causados por el acceso a un puntero nulo. En este caso, tm probablemente es 0 debido a un problema con localtime o gettimeofday. Usted obtener dirección 0x08 en lugar de 0x00, ya que el compilador está tratando de leer un valor de 8 bytes en la estructura.

    • Creo que esta es la causa, pero tengo la necesidad de leer el tiempo … gracias por la respuesta!
  4. 1

    El tipo de miembro que tv.tv_sec es long, pero localtime espera un time_t * parámetro. En VC6 esto funcionó porque ambos long y time_t eran de 32 bits, pero en VS2008 time_t es de 64 bits tipo por lo que son incompatibles.

    Esto debería solucionar el problema:

    //add to beginning of stampstart function:
    time_t t;
    //... other code...
    //put this instead of call to localtime:
    t = tv.tv_sec;
    tm = localtime(&t);
    • En realidad ya he probado esto : tm = localtime((time_t *) &tv.tv_sec); y sigue recibiendo el mismo error (manejo de excepciones)…
    • Me olvidé de esto es C, por lo que las variables deben ser declaradas al principio de la función. He editado mi respuesta a mostrar esto. En cuanto a tu segundo comentario, fundición a time_t* no ayuda porque no tiene un real time_t a punto.
    • gracias! sí, tiene usted derecho como yo remenbered justo después de que yo le respondí a tu mensaje que es C. sí! lo probé también y sigue recibiendo el mismo error … alguna otra idea… gracias de nuevo por tu ayuda
    • Por «el mismo error», se refiere a C2275 o infracción de acceso?
    • Me refiero a que la excepción no controlada… aquí es una copia : excepción de Primera oportunidad en 0x0041166a en tim.exe: 0xC0000005: infracción de Acceso de lectura ubicación 0x00000008. Excepción no controlada en 0x0041166a en tim.exe: 0xC0000005: infracción de Acceso de lectura ubicación 0x00000008.
  5. 0

    Con la dirección de mi SWAG es que tm es NULO. Puesto que usted nunca comprobar el NULO después de la llamada a localtime(), que se desreferenciar un puntero NULL.

    Edición: SWAG = Científicos Asno Salvaje Adivinar.

    La dirección 0x00000008 es el mismo desplazamiento de tm.tm_hour. Usted está tratando de acceder tm->tm_hour cuando se pasa en el parámetro a printf().

    • que swag estás hablando …? Tengo un error cuando ejecuto el ejecutable. el programa se compila y enlaza sin errores. pero cuando voy a ejecutar, me sale excepción no controlada … gracias por la respuesta!
    • «Específico mientras que el culo de adivinar» 🙂 Y sería compilar de forma limpia, ya que el compilador no tiene manera de saber que tm se va a acabar null cuando se ejecuta el programa. Eso no puede ocurrir hasta que se ejecute.
    • gracias por la respuesta. en realidad no tengo experiencia con visual C++ y es la primera vez que me enterado de SWAG.Así que por favor explique y me diga cómo utilizar para resolver este poblem … gracias de nuevo

Dejar respuesta

Please enter your comment!
Please enter your name here