Преобразование миллисекунд в timespec-перенос GNU
Я хочу преобразовать миллисекунды в структуру timespec 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"
У меня также есть include времени.h в коде.
2 ответов
на timespec
структура представляет время в двух частях-секундах и наносекундах. Таким образом, алгоритм преобразования из миллисекунд довольно прост. Одна секунда - тысяча миллисекунд, одна миллисекунда - тысяча микросекунд, одна микросекунда - тысяча наносекунд, за что мы благодарны SI. Поэтому сначала нам нужно разделить миллисекунды на тысячу, чтобы получить количество секунд. Сказать, например, 1500 миллисекунд / 1000 = 1,5 секунды. Учитывая целочисленную арифметику (а не плавающую точку), остаток отбрасывается (т. е. 1500 / 1000 равен только 1, а не 1.5). Затем нам нужно взять остаток, который обозначает количество миллисекунд, которое определенно меньше одной секунды, и умножить его на миллион, чтобы преобразовать его в наносекунды. Чтобы получить остаток деления на 1000, мы используем модуль оператора (%
) (т. е. 1500 % 1000 is equal to 500
). Например, преобразуем 4321 миллисекунду в секунды и наносекунды:
- 4321 (миллисекунды) / 1000 = 4 (секунды)
- 4321 (миллисекунды) % 1000 = 321 (миллисекунды)
- 321 (миллисекунды) * 1000000 = 321000000 (наносекунды)
зная, выше, единственное что осталось, это написать немного кода на C. Есть несколько вещей, которые вы не сделать правильно:
- в C вы должны префиксировать типы данных структуры с
struct
. Например, вместо говоря:timespec
скажете выstruct timespec
. В C++, однако, вам не нужно этого делать (к сожалению, на мой взгляд). - вы не можете возвращать структуры из функции в C. Поэтому вам нужно передать структуру указателем в функцию, которая что-то делает с этой структурой.
Edit: это противоречит (верните ' 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'Ed, поэтому вам нужно добавить timespec со struct. И разработать вторую часть nano, если вы хотите быть точным. Обратите внимание, что req не является указателем. Таким образом, к членам нельзя получить доступ с помощью' ->'