搜索此答案但找不到任何内容。我能找到的最接近的是 difftime returning 0 when there is clearly a difference这有一个很好的解释,与参数如何被推入堆栈以及格式所期望的有关,但我认为我的问题不同:
我尽可能简单地做了一个例子。假设我在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;
某些功能是一些运行1或2秒的功能。我得到的输出是:
starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000
我甚至不知道从哪里开始我的问题。为什么在我交换订单时,输出值仍然相同?此外,为什么其中一个值为0?这是相同的我是否使用%f,%d,%lu,%llu等。是否有堆栈参数解释?什么是fprintf真正在内部做什么?
谢谢。我已经浪费了太多的时间来尝试调试这个,我真的很感激你的帮助!
答案 0 :(得分:2)
"%f"
说明符不适合您平台上的time_t
。据我所知,time_t
类型可以是整数或实数。
例如the POSIX standard只是说:
time_t
和clock_t
应为整数或实数浮点类型。
试试这个:
/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);
我已经看到了将其投放到uintmax_t
,unsigned long long
等的建议。显然,真正的答案是here:
没有统一的方法来printf()time_t,period。你不是 应该这样做 - 你甚至不需要知道什么是time_t 内部。建议的替代方案包括ctime()和strftime()。 请使用这些来保持代码的便携性。
答案 1 :(得分:1)
starttime
是time_t
,但是您要打印%f
,预计double
。显然,在您的平台上,time_t
是一种整数类型。
可能,您的平台对变量参数列表函数(如fprintf()
)的调用约定将浮点参数传递到与整数参数不同的位置。
difftime()
函数可能返回2.0,它在第一个浮点参数位置传递,这就是为什么第一个%f
在两种情况下都打印出2.0。第二个浮点参数位置似乎包含零,因此第二个%f
在两种情况下都打印为零。 time_t
参数被放置在fprintf()
代码未检查的其他位置。