2010-01-29 76 views
0

我在这个程序中有一个bug,我不断回到这两个函数,但他们看起来是对我的。这里有什么问题吗?这些mssec <-> 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

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

+0

这对我很有用。谢谢。 – Scott 2010-01-29 04:19:44

3

你的第一个功能是四舍五入,使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; 

(以上所有假设你没有处理负面timevals - 如果你是,它变得更复杂)。

相关问题