8

ミリ秒を 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__」が必要です</p>

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

4

3 に答える 3

12

この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の関数から「構造体」を返します)。

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

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

于 2013-02-22T14:27:06.883 に答える
1

これを試して:

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 の先頭に構造体を追加する必要があります。正確にしたい場合は、ナノ秒の部分を計算してください。req はポインターではないことに注意してください。したがって、「->」でメンバーにアクセスすることはできません

于 2013-02-22T13:17:45.210 に答える