timespec
struktura představuje čas ve dvou částech – sekundách a nanosekundách. Algoritmus pro převod z milisekund je tedy zatraceně jednoduchý. Jedna sekunda má tisíc milisekund, jedna milisekunda má tisíc mikrosekund a jedna mikrosekunda má tisíc nanosekund, za což jsme vděčni SI. Proto musíme nejprve vydělit milisekundy tisíci, abychom získali počet sekund. Řekněme například 1500 milisekund / 1000 =1,5 sekundy. Vzhledem k celočíselné aritmetice (ne s pohyblivou řádovou čárkou) se zbytek vynechá (tj. 1500 / 1000 se rovná pouze 1, nikoli 1,5). Pak musíme vzít zbytek, který označuje počet milisekund, který je rozhodně menší než jedna sekunda, a vynásobit ho milionem, abychom jej převedli na nanosekundy. K získání zbytku z dělení 1000 používáme modulový operátor (%
) (tj. 1500 % 1000 is equal to 500
). Převeďme například 4321 milisekund na sekundy a nanosekundy:
- 4321 (milisekundy) / 1000 =4 (sekundy)
- 4321 (milisekundy) % 1000 =321 (milisekundy)
- 321 (milisekundy) * 1000000 =321000000 (nanosekundy)
S vědomím výše uvedeného zbývá pouze napsat trochu C kódu. Je několik věcí, které jste nepochopili správně:
- V C musíte datovým typům struktury předponovat
struct
. Například místo slovatimespec
řeknetestruct timespec
. V C++ to ale dělat nemusíte (podle mě bohužel). - Nemůžete vrátit struktury z funkce v C. Proto musíte předat strukturu ukazatelem do funkce, která s touto strukturou něco dělá.
Edit:To je v rozporu (Vrátí `struct` z funkce v C).
Dobře, dost řečí. Níže je jednoduchý příklad kódu 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;
}
Doufám, že to pomůže. Hodně štěstí!