2010-03-22 2 views
2

Может ли кто-нибудь помочь мне решить необработанную ошибку исключения при использовании Visual C++ 2008? ошибка отображается следующим образом: Необработанное исключение в 0x00411690 в Time.exe: 0xC0000005: нарушение прав доступа место чтения 0x00000008как решить необработанную ошибку исключения при использовании Visual C++ 2008?

Некоторые детали:
- тм 0x00000000 {tm_sec = ??? tm_min = ??? tm_hour = ??? ...} тм *
tm_sec CXX0030: Ошибка: выражение не может быть оценено
...

На самом деле, когда я использовал Visual C++ 6 в прошлом, не было какой-либо ошибки и программа работает нормально. Но теперь, когда я использую visual 2008, я получаю эту ошибку Unhandled exception.

Вот программа:

... 
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); 

} 

спасибо за ваши ответы:

+0

Используйте отладчик Visual Studio, шаг в код, и сказать нам, где происходит исключение ... – Inverse

+0

На какой линии вы получаете это исключение ...? –

+0

Спасибо за ответы ... см. Строку: tm-> tm_sec * 1000 + tv.tv_usec/1000); функции uint32_t stampstart() – make

ответ

0

С этим адресом, мой SWAG является то, что тм является NULL. Поскольку вы никогда не проверяете NULL после вызова localtime(), вы разыскиваете указатель NULL.

Редактировать: SWAG = Scientific Wild Ass Guess.

Адрес 0x00000008 - это то же самое смещение tm.tm_hour. Вы пытаетесь получить доступ к tm-> tm_hour, когда вы передаете параметр printf().

+0

, о котором вы говорите. ..? Я получаю ошибку при запуске исполняемого файла. программа скомпилирована и связана без ошибок. но когда я его выполняю, я получаю необработанное исключение ... спасибо за ответ! – make

+0

«Конкретно, пока угадайте предположение» :) И он будет скомпилирован, потому что компилятор не знает, что при запуске программы 'tm' будет заканчиваться нулевым. Это не может произойти до тех пор, пока вы не выполните. –

+0

благодарит за ответ. на самом деле у меня нет опыта работы с визуальным C++, и это первый раз, когда я слышал об SWAG. Поэтому объясните и скажите мне, как использовать для решения этого poblem ... еще раз спасибо – make

1

Нарушение прав доступа относится к адресу 0x00000008, что, вероятно, означает, что ваш код обращается к полю со смещением 8 в структуре, к которой вы указываете указатель NULL. Я предполагаю, что localtime возвращает указатель NULL. Проверь это.

+0

Возможно, но почему он работает с VC++ 6, а не с VC++ 2008? Спасибо за ваш ответ! – make

1

«Доступ чтение нарушения расположение 0x00000008»

Адрес, который низко, вероятно, вызван доступ к нулевому указателю. В этом случае tm, вероятно, 0 из-за проблемы с localtime или gettimeofday. Вы получаете адрес 0x08 вместо 0x00, потому что компилятор пытается прочитать значение 8 байтов в структуре.

+0

Я думаю, что это тоже причина, но мне нужно прочитать время ... спасибо за ответ! – make

2

попробовать что-то вроде ...

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 
} 
+0

спасибо за идею. да! он не может получить местное время. Есть ли идея о том, как решить эту проблему? Еще раз спасибо за вашу помощь – make

+0

вы можете увидеть errno для точной проблемы ... если localtime() не удалось установить errno ... –

+0

да! это местное время, поскольку оно не возвращает anythink. на самом деле я не понимаю, почему он работает с VC++ 6, а не с VC++ 2008 ... спасибо! – make

1

Тип элемента tv.tv_sec является long, но localtime ожидает параметр time_t *. В VC6 это работало потому, что и long, и time_t были 32-разрядными, но в VS2008 time_t является 64-битным типом, поэтому они несовместимы.

Это должно исправить:

//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); 
+0

На самом деле я уже пробовал это: tm = localtime ((time_t *) & tv.tv_sec); и все еще получаю ту же ошибку (обработка исключений) ... – make

+0

@make: Я забыл, что это C, поэтому переменные должны быть объявлены в начале функции. Я отредактировал свой ответ, чтобы показать это. Что касается вашего второго комментария, отбрасывание его на 'time_t *' не поможет, потому что у него нет фактического 'time_t', чтобы указать на. – interjay

+0

спасибо! да, вы правы, так как я помню сразу после того, как я ответил на ваше сообщение, что это C. да! Я попробовал это и все еще получаю ту же ошибку ... любые другие идеи ... еще раз спасибо за вашу помощь – make

0

Чтобы поймать такого рода исключения несовершеннолетнего подстройка проекта необходимо. Просто включите/EHa в настройках проекта. См. Свойства проекта -> C/C++ -> Генерация кода -> Измените Исключенные исключения C++ на «Да с исключениями SEH». Это оно!

Подробнее здесь: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

Смежные вопросы