Конвертировать миллисекунды в timepec - GNU Porting

Я хочу конвертировать миллисекунды в структуру временного спектра GNU(GCC) Linux. Я попробовал следующий код для того же.

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

Запуск этого кода дает мне следующую ошибку.

ожидается '=', ',', ';', 'asm' или '__attribute__' перед 'GetTimeSpecValue'

Я также включил в код файл time.h.

2 ответа

Решение

timespec Структура представляет время в двух частях - секундах и наносекундах. Таким образом, алгоритм конвертации в миллисекундах чертовски прост. Одна секунда имеет тысячу миллисекунд, одна миллисекунда имеет тысячу микросекунд, а одна микросекунда имеет тысячу наносекунд, за что мы благодарны SI. Поэтому сначала нужно разделить миллисекунды на тысячу, чтобы получить количество секунд. Скажем, например, 1500 миллисекунд / 1000 = 1,5 секунды. Учитывая целочисленную арифметику (не с плавающей запятой), остаток отбрасывается (т. Е. 1500 / 1000 равно только 1, а не 1,5). Затем нам нужно взять остаток, который обозначает количество миллисекунд, которое определенно меньше одной секунды, и умножить его на миллион, чтобы преобразовать его в наносекунды. Чтобы получить остаток от деления на 1000, мы используем оператор модуля ( % ) (т.е. 1500 % 1000 is equal to 500). Например, давайте конвертируем 4321 миллисекунды в секунды и наносекунды:

  1. 4321 (миллисекунды) / 1000 = 4 (секунды)
  2. 4321 (миллисекунды) % 1000 = 321 (миллисекунды)
  3. 321 (миллисекунды) * 1000000 = 321000000 (наносекунды)

Зная выше, единственное, что осталось, это написать немного кода на Си. Есть несколько вещей, которые вы не поняли правильно:

  1. В C вы должны префиксировать структурные типы данных с struct, Например, вместо того, чтобы сказать timespec ты говоришь struct timespec, В C++, однако, вам не нужно это делать (к сожалению, на мой взгляд).
  2. Вы не можете возвращать структуры из функции в C. Следовательно, вам нужно передать структуру по указателю в функцию, которая что-то делает с этой структурой.

Редактировать: это противоречит ( вернуть `struct` из функции в C).

Хорошо, хватит говорить. Ниже приведен простой пример кода на 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;
}

Надеюсь, поможет. Удачи!

Попробуй это:

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, поэтому вам нужно добавить в начало timepec структуру. И разработайте нано-вторую часть, если хотите быть точным. Обратите внимание, что req не является указателем. Таким образом, члены не могут быть доступны с '->'

Включая несколько настроек ответа, включая комментарий Джеффри, приведенный ниже код позволяет избежать делений для небольшой задержки и по модулю для большой задержки:

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;
    }
}
Другие вопросы по тегам