правильны ли эти временные функции msec <->? - PullRequest
0 голосов
/ 29 января 2010

У меня есть ошибка в этой программе, и я продолжаю возвращаться к этим двум функциям, но они выглядят прямо для меня. Здесь что-то не так?

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 ]

3 голосов
/ 29 января 2010

Ваша первая функция округляется, так что 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 голосов
/ 29 января 2010

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 цента: -)

...