2010-03-22 28 views
2

在使用Visual C++ 2008時,有人能幫助我解決未處理的異常錯誤嗎?錯誤顯示爲:在0x00411690在time.exe未處理的異常:0000005:訪問衝突讀取位置0x00000008如何解決使用Visual C++ 2008時未處理的異常錯誤?

一些細節:
- TM 00000000 {tm_sec = ??? tm_min = ??? tm_hour = ??? ...} TM *
tm_sec CXX0030:錯誤:表達無法評估
...

實際上,當我用VISUAL C++ 6在過去,沒有發現任何錯誤,以及程序運行良好。但現在我用visual 2008,我得到這個未處理的異常錯誤。

下面是程序:

... 
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 2010-03-22 07:01:58

+0

你在哪條線上得到這個例外......? – 2010-03-22 07:04:14

+0

感謝您的回覆...請參閱以下行:tm-> tm_sec * 1000 + tv.tv_usec/1000); uint32_t stampstart()函數 – make 2010-03-22 07:11:54

回答

0

與該地址,我的贓物是,TM爲NULL。由於您在調用localtime()之後從不檢查NULL,所以您正在取消引用NULL指針。

編輯:SWAG =科學野驢猜測。

地址0x00000008與tm.tm_hour的偏移量相同。當您將參數傳遞給printf()時,您試圖訪問tm-> tm_hour。

+0

哪個贓物你在說什麼。 ..?我運行可執行文件時遇到錯誤。該程序編譯和鏈接沒有錯誤。但是當我執行它時,我得到未處理的異常......感謝回覆! – make 2010-03-22 07:28:36

+0

「具體而驢猜」:)它會編譯乾淨,因爲編譯器無法知道當你運行該程序時'tm'會結束null。直到你執行,這是不可能發生的。 – 2010-03-22 07:35:29

+0

感謝您的回覆。實際上我沒有Visual C++的經驗,這是我第一次聽說SWAG。所以請解釋並告訴我如何使用來解決這個問題......再次感謝 – make 2010-03-22 14:09:49

1

訪問衝突是指地址0x00000008,這可能意味着您的代碼正在訪問一個指向NULL指針的結構中偏移量爲8的字段。 我想localtime返回一個空指針。檢查這個。

+0

也許,但它爲什麼可以用VC++ 6而不是用VC++ 2008?感謝您的回覆! – make 2010-03-22 07:43:20

1

「訪問衝突讀取位置0x00000008」

的地址低可能是通過訪問一個空指針引起的。在這種情況下,由於localtimegettimeofday的問題,tm可能爲0。你得到的地址是0x08而不是0x00,因爲編譯器試圖在結構中讀取8個字節的值。

+0

我認爲這也是原因,但我需要閱讀時間......感謝您的回覆! – make 2010-03-22 07:41:46

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 2010-03-22 07:40:14

+0

你可以看到errno的確切問題......如果localtime()失敗,它將設置errno ... – 2010-03-22 09:13:29

+0

是的!它是本地時間,因爲它不會返回任何想法。實際上我不明白它爲什麼可以用VC++ 6而不用VC++ 2008 ......謝謝! – make 2010-03-22 14:11:54

1

類型成員tv.tv_sec的是long,但localtime需要一個time_t *參數。在VC6中,這是因爲longtime_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 2010-03-22 19:30:56

+0

@make:我忘了這是C,所以變量必須在函數的開頭聲明。我編輯了我的答案來表明這一點。至於你的第二個評論,將它轉換爲'time_t *'將無濟於事,因爲它沒有實際的'time_t'指向。 – interjay 2010-03-22 19:59:32

+0

謝謝!是的,你是對的,因爲我回復你的信息後,我剛剛恢復正常,答案是肯定的。我也嘗試了這一點,仍然得到相同的錯誤...任何其他想法...再次感謝您的幫助 – make 2010-03-22 20:03:44

相關問題