【问题标题】:are these msec<->timeval functions correct?这些 msec<->timeval 函数是否正确?
【发布时间】:2011-01-10 17:12:00
【问题描述】:

我在这个程序中有一个错误,我不断地回到这两个函数,但它们看起来对我来说是正确的。这里有什么问题吗?

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

【问题讨论】:

    标签: c timeval


    【解决方案1】:

    您的第一个函数是向下舍入,因此 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;
    

    (以上都假设您没有处理负时间 - 如果是,它会变得更加复杂)。

    【讨论】:

      【解决方案2】:

      visual_time_set_from_msec 看起来不对...

      如果有人调用 visual_time_set_from_msec(time, 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 美分 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2015-03-18
        • 1970-01-01
        相关资源
        最近更新 更多