0

このプログラムにはバグがあり、これら 2 つの関数に何度も戻ってきますが、私には正しいように見えます。ここで何か問題がありますか?

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

2 に答える 2

3

最初の関数は切り捨てであるため、1.000999 秒は 1001ms ではなく 1000ms に丸められます。これを修正するには (最も近いミリ秒に丸めます)、次のようにします。

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は、2 番目の例で切り捨てを既に指摘しています。追加する唯一のことは、モジュロ演算子を使用して少し単純化できることです。

long sec = msec / 1000;
long usec = (msec % 1000) * 1000;

(上記のすべては、負の timevals を扱っていないことを前提としています。負の timevals を扱っている場合は、より複雑になります)。

于 2010-01-29T04:46:24.493 に答える
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セントです:-)

于 2010-01-29T04:15:32.990 に答える