首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这些msec<->timeval函数是否正确?

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

Stack Overflow用户
提问于 2010-01-29 12:10:00
回答 2查看 469关注 0票数 0

我在这个程序中有一个bug,我总是返回到这两个函数,但它们在我看来是正确的。这里有什么问题吗?

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-29 12:15:33

visual_time_set_from_msec看起来不太对劲...

如果有人调用visual_time_set_from_msec(time,999),那么您的结构将被设置为零,而不是999000us。

你应该做的是:

代码语言:javascript
复制
// 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分钱:-)

票数 2
EN

Stack Overflow用户

发布于 2010-01-29 12:46:24

您的第一个函数是向下舍入,因此1.000999秒将舍入为1000ms,而不是1001ms。要解决这个问题(将其舍入到最接近的毫秒),您可以这样做:

代码语言:javascript
复制
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已经在你的第二个例子中指出了截断--我唯一想补充的是,你可以使用模运算符对其进行一点简化:

代码语言:javascript
复制
long sec = msec / 1000;
long usec = (msec % 1000) * 1000;

(以上所有都假设您正在处理的不是负时间-如果是,事情就会变得更加复杂)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2159826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档