2011-12-10 31 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