Il timespec
La struttura rappresenta il tempo in due porzioni:secondi e nanosecondi. Pertanto, l'algoritmo per la conversione da millisecondi è dannatamente semplice. Un secondo ha mille millisecondi, un millisecondo ha mille microsecondi e un microsecondo ha mille nanosecondi, per i quali siamo grati a SI. Pertanto, dobbiamo prima dividere i millisecondi per mille per ottenere un numero di secondi. Supponiamo, ad esempio, 1500 millisecondi/1000 =1,5 secondi. Data l'aritmetica dei numeri interi (non un punto mobile), il resto viene eliminato (ovvero 1500/1000 è uguale a solo 1, non 1,5). Quindi dobbiamo prendere un resto che denota un numero di millisecondi decisamente inferiore a un secondo e moltiplicarlo per un milione per convertirlo in nanosecondi. Per ottenere il resto della divisione per 1000, usiamo un operatore di modulo (%
) (ovvero 1500 % 1000 is equal to 500
). Ad esempio, convertiamo 4321 millisecondi in secondi e nanosecondi:
- 4321 (millisecondi) / 1000 =4 (secondi)
- 4321 (millisecondi) % 1000 =321 (millisecondi)
- 321 (millisecondi) * 1000000 =321000000 (nanosecondi)
Sapendo quanto sopra, l'unica cosa che rimane è scrivere un po' di codice C. Ci sono alcune cose che non hai capito bene:
- In C, devi prefissare i tipi di dati della struttura con
struct
. Ad esempio, invece di diretimespec
tu dicistruct timespec
. In C++, tuttavia, non sei obbligato a farlo (sfortunatamente, secondo me). - Non puoi restituire strutture dalla funzione in C. Pertanto, devi passare una struttura per puntatore in una funzione che faccia qualcosa con quella struttura.
Modifica:questo contraddice (Restituisci una `struct` da una funzione in C).
OK, basta parlare. Di seguito è riportato un semplice esempio di codice 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;
}
Spero che sia d'aiuto. Buona fortuna!