2014-09-24 63 views
0

我需要使用兩個integer參數p1和p2來代表timeval結構。 我已將tv_sec複製到p1和tv_usec到p2。 在32位(分)sizeof(long) = sizeof(int)因此我能夠做到以上說的事情。複製timeval成員變量爲整數變量

但是在64位系統中,(sizeof(tv_sec)= 8)。

在64位系統中,我如何將這個tv_sec分配給p1和p2作爲32位系統的?

我在下面的代碼中給出,

#include <iostream> 
#include <sys/time.h> 
using namespace std; 

int main() 
{ 
    struct timeval mytime; 

    gettimeofday(&mytime, NULL); 

    cout << "tv_sec_1 : " << mytime.tv_sec << endl; 
    cout << "tv_usec_1 : " << mytime.tv_usec << endl; 

    int p1 = mytime.tv_sec; 
    int p2 = mytime.tv_usec; 

} 

我需要通過使用兩個自由整數變量 通過輸出傳遞到調用函數的結構,這些信息的timeval。我的目標不是修改結果結構。

+0

我很困惑。 'gettimeofday()'** tv_usec值始終爲零。**。無論tv_usec爲0的機率總是不大可能。你確定你在這種情況下調用'gettimeofday(&mytime,NULL)';'在訪問'mytime'之前。除了您提供的示例中顯示的內容外,這裏看起來像是一個編碼錯誤。 – 2014-09-24 16:56:57

+0

對不起,tv_usec值不總是0,我的代碼中有bug – Deepak 2014-09-25 09:19:52

+1

'tv_usec'是微秒,所以會是一個從0到999,999的數字。這應該適合int沒有問題。如果'tv_sec'被存儲爲有符號的32位整數,它可以高達2^31-1(2147483647)。這對'UTC 2038-01-19 3:14:07'之後的日期造成了一個問題,因爲它將成爲一個負數並且回到1901年年底。如果你不關心2038年以後的工作, 01-19然後存儲在一個'int'應該工作。 – 2014-09-25 15:07:04

回答

2

tv_sectv_usec的大小可以根據您所在的系統而變化。爲了避免這種情況,你不應該使用int來存儲它們的值。您應該使用適當的類型 - 即time_tsuseconds_t

你的代碼應該是:

time_t p1 = mytime.tv_sec; 
suseconds_t p2 = mytime.tv_usec; 

這個信息可以在人與信息頁。這個link有正確使用時間函數的信息。特別是他們有這樣的說法time_t vs int

與行爲中的「int」完全相同。您可以將int值 分配給time_t變量,反之亦然,並使用 %d格式和所有內容來打印time_t值。 在未來,無論是time_t的將不再是相同的int或 的「INT」的含義將改變從4字節整數到8個字節的整數

我修改了我原來的答覆是更完整/正確的感謝Mike Seymour的評論。

+2

'time_t'不一定適用於微秒,這就是爲什麼它在'timeval'內具有不同類型'suseconds_t'。 – 2014-09-24 16:15:54

+0

我有項目,在那結果是通過一個結構傳遞出去的。有一些整數參數在結果結構中未使用。我的目標是使用這些未使用的整數來傳遞此timeval,而不修改結果結構。在上述情況下,p1和p2是未使用的整數參數 – Deepak 2014-09-24 16:19:33