2010-01-29 2 views
0

У меня есть ошибка в этой программе, и я продолжаю возвращаться к этим двум функциям, но они смотрят прямо на меня. Что-то здесь не так?являются эти msec <-> функции 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

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; 

(выше всего предположить, что вы не имеет дело с отрицательным timevals - если вы, она становится все более сложной).