这些msec< - > timeval函数是否正确?

时间:2010-01-29 04:10:00

标签: c timeval

我在这个程序中有一个错误,我一直回到这两个功能,但他们看起来对我来说。这有什么不对吗?

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;
}

2 个答案:

答案 0 :(得分:3)

你的第一个功能是四舍五入,因此1.000999秒被舍入到1000毫秒,而不是1001毫秒。要解决这个问题(将其舍入到最接近的毫秒),您可以这样做:

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;

(以上都假设你没有处理负时间 - 如果你是,那就更复杂了。)

答案 1 :(得分:2)

visual_time_set_from_msec看起来不正确......

如果有人调用visual_time_set_from_msec(时间,999),那么你的结构将被设置为零,而不是999,000us。

你应该做的是:

// 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美分: - )