web-dev-qa-db-ja.com

GNUポートのミリ秒をtimespecに変換する

ミリ秒をGNU Linuxで使用されるtimespec構造に変換したい。同じコードを次のように試しました。

  timespec GetTimeSpecValue(unsigned long milisec)
  {
    struct timespec req;
    //long sec = (milisecondtime /1000);
    time_t sec = (time_t)(milisec/1000);
    req->tv_sec = sec;
    req->tv_nsec = 0;
    return req;
  }

このコードを実行すると、次のエラーが発生します。

「GetTimeSpecValue」の前に「=」、「、」、「;」、「asm」、または「__attribute__」が必要です

また、コードにtime.hファイルを含めました。

8
Parth Jani

timespec構造体は、秒とナノ秒の2つの部分で時間を表します。したがって、ミリ秒からの変換のアルゴリズムは非常に単純です。 1秒は1000ミリ秒、1ミリ秒は1000マイクロ秒、1マイクロ秒は1000ナノ秒であり、 [〜#〜] si [〜#〜] に感謝しています。したがって、秒数を取得するには、最初にミリ秒を1000で割る必要があります。たとえば、1500ミリ秒/ 1000 = 1.5秒とします。整数演算(浮動小数点ではない)が与えられると、余りは削除されます(つまり、1500/1000は1.5ではなく1に等しくなります)。次に、1秒未満であることを示すミリ秒数を示す余りを取り、それに100万を掛けて、ナノ秒に変換する必要があります。余りを1000で割るには、 モジュール演算子(% (つまり、1500 % 1000 is equal to 500)を使用します。たとえば、4321ミリ秒を秒とナノ秒に変換してみましょう。

  1. 4321(ミリ秒)/ 1000 = 4(秒)
  2. 4321(ミリ秒)%1000 = 321(ミリ秒)
  3. 321(ミリ秒)* 1000000 = 321000000(ナノ秒)

上記を知っていると、残っているのはCコードを少し書くことだけです。あなたが正しく理解しなかったことがいくつかあります:

  1. Cでは、構造データ型の前にstructを付ける必要があります。たとえば、timespecと言う代わりに、struct timespecと言います。ただし、C++では、それを行う必要はありません(残念ながら、私の意見では)。
  2. Cの関数から構造体を返すことはできません。したがって、ポインターによって構造体を、その構造体で何かを行う関数に渡す必要があります。

編集:これは矛盾します( Cの関数から `struct`を返す )。

OK、十分に話しています。以下は簡単なCコードの例です。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

static void ms2ts(struct timespec *ts, unsigned long ms)
{
    ts->tv_sec = ms / 1000;
    ts->tv_nsec = (ms % 1000) * 1000000;
}

static void print_ts(unsigned long ms)
{
    struct timespec ts;
    ms2ts(&ts, ms);
    printf("%lu milliseconds is %ld seconds and %ld nanoseconds.\n",
           ms, ts.tv_sec, ts.tv_nsec);
}

int main()
{
    print_ts(1000);
    print_ts(2500);
    print_ts(4321);
    return EXIT_SUCCESS;
}

それが役に立てば幸い。幸運を!

11
user405725

これを試して:

struct timespec GetTimeSpecValue(unsigned long millisec) {
    struct timespec req;
    req.tv_sec=  (time_t)(millisec/1000);
    req.tv_nsec = (millisec % 1000) * 1000000;
    return req;
}

Struct timespecがtypedefされているとは思わないので、timespecの前にstructを付ける必要があります。正確にしたい場合は、ナノ秒の部分を計算してください。 reqはポインタではないことに注意してください。したがって、「->」を使用してメンバーにアクセスすることはできません。

2
hetepeperfan

以下のコードは、Geoffreyのコメントを含む回答にいくつかの調整を組み込んでおり、小さな遅延の場合は除算を、長い遅延の場合はモジュロを回避しています。

void msec_to_timespec(unsigned long msec, struct timespec *ts)
{
    if (msec < 1000){
        ts->tv_sec = 0;
        ts->tv_nsec = msec * 1000000;
    }
    else {
        ts->tv_sec = msec / 1000;
        ts->tv_nsec = (msec - ts->tv_sec * 1000) * 1000000;
    }
}
0
trench_digger