2011-12-10 56 views
0

已搜索此答案,但找不到任何內容。我能找到的最接近的是 difftime returning 0 when there is clearly a difference其中有具有與自變量進行壓入堆棧,什麼格式要求做了很好的解釋,但我想我的問題是不同的:fprintf and difftime madness

我所做的那樣簡單儘可能的例子。假設我有以下代碼在C:

time_t starttime = time(NULL) 
somefunction(); 
time_t newtime = time(NULL) 

fprintf(stderr, "starttime %f and difftime %f\n", starttime, difftime(newtime, starttime)); 
fprintf(stderr, "difftime %f and starttime %f\n", difftime(newtime, starttime), starttime); 
return 0; 

而somefunction是對於1或2秒運行一些功能。我得到這個輸出是:

starttime 2.000000 and difftime 0.000000 
difftime 2.000000 and starttime 0.000000 

我甚至不知道從哪裏開始我的問題。爲什麼當我交換訂單時,輸出的值仍然是相同的?此外,爲什麼其中一個值爲0?無論我使用%f,%d,%lu,%llu等,這都是一樣的。是否有對此的棧參數解釋? fprintf真的在內部做什麼?

謝謝。我已經浪費了太多的時間去嘗試調試,我真的很感謝你的幫助!

回答

1

starttimetime_t,但你與一個%f,這需要一個double打印。顯然,在你的平臺上,time_t是一些整數類型。

可能,您的平臺對變量參數列表函數(如fprintf())的調用約定將浮點參數傳遞到與整型參數不同的位置。

difftime()功能很可能返回2.0,其在所述第一浮點參數位置,這就是爲什麼在第一%f打印在兩種情況下2.0被傳遞。第二個浮點參數位置似乎包含一個零,因此第二個%f在兩種情況下都打印一個零。 time_t參數被放置在一個不被fprintf()代碼檢查的地方。

2

"%f"說明符在您的平臺上不適用於time_t。據我所知time_t類型可以是完整的或真實的。

例如the POSIX standard只是說:

time_tclock_t應爲整數或實浮點類型。

試試這個:

/* Flawed bad and wrong. */ 
printf("%f\n", (double)starttime); 

我見過的建議投它uintmax_tunsigned long long等。顯然,真正的答案是here

沒有給printf沒有統一的辦法()time_t,句點。你不是 應該這樣做 - 你甚至不需要知道在內部什麼是time_t是 。建議的選擇包括ctime()和strftime()。 請使用這些來保持代碼的便攜性。

+0

它似乎並不重要什麼說明符我使用。你建議我用什麼來代替? – bhh1988

+0

@ bhh1988:格式字符串_must_中的說明符與您作爲參數傳遞的變量的類型相匹配。發佈的示例cnicutar會將'time_t'值轉換爲double,以確保它們匹配。 – Mat