我在这个程序中有一个bug,我总是返回到这两个函数,但它们在我看来是正确的。这里有什么问题吗?
long visual_time_get_msec(VisTime *time_)
{
visual_log_return_val_if_fail(time_ != NULL, 0);
return time_->tv_sec * 1000 + time_->tv_usec / 1000;
}
int visual_time_set_from_msec(VisTime *time_, long msec)
{
visual_log_return_val_if_fail(time_ != NULL, -VISUAL_ERROR_TIME_NULL);
long sec = msec / 1000;
long usec = 0;
visual_time_set(time_, sec, usec);
return VISUAL_OK;
}发布于 2010-01-29 12:15:33
visual_time_set_from_msec看起来不太对劲...
如果有人调用visual_time_set_from_msec(time,999),那么您的结构将被设置为零,而不是999000us。
你应该做的是:
// Calculate number of seconds
long sec = msec / 1000;
// Calculate remainding microseconds after number of seconds is taken in to account
long usec = (msec - 1000*sec) * 1000;这真的取决于你的输入,但这是我的2分钱:-)
发布于 2010-01-29 12:46:24
您的第一个函数是向下舍入,因此1.000999秒将舍入为1000ms,而不是1001ms。要解决这个问题(将其舍入到最接近的毫秒),您可以这样做:
long visual_time_get_msec(VisTime *time_)
{
visual_log_return_val_if_fail(time_ != NULL, 0);
return time_->tv_sec * 1000 + (time_->tv_usec + 500) / 1000;
}Fuzz已经在你的第二个例子中指出了截断--我唯一想补充的是,你可以使用模运算符对其进行一点简化:
long sec = msec / 1000;
long usec = (msec % 1000) * 1000;(以上所有都假设您正在处理的不是负时间-如果是,事情就会变得更加复杂)。
https://stackoverflow.com/questions/2159826
复制相似问题