La struttura timespec
rappresenta il tempo in due parti: secondi e nanosecondi. Pertanto, l'algoritmo per la conversione da millisecondi è piuttosto semplice. Un secondo ha migliaia di millisecondi, un millisecondo ha mille microsecondi e un microsecondo ha mille nanosecondi, per cui siamo grati allo SI. Pertanto, dobbiamo prima dividere i millisecondi per mille per ottenere un numero di secondi. Ad esempio, 1500 millisecondi/1000 = 1,5 secondi. Dato l'aritmetica dei numeri interi (non un punto mobile), il resto viene eliminato (ovvero 1500/1000 è uguale a solo 1, non a 1,5). Quindi dobbiamo prendere un resto che denoti un numero di millisecondi che è decisamente inferiore a un secondo e moltiplicarlo per un milione per convertirlo in nanosecondi. Per ottenere un resto della divisione per 1000, utilizziamo uno module operator (%
) (ad esempio 1500 % 1000 is equal to 500
). Ad esempio, supponiamo convertire 4321 millisecondi a secondi e nanosecondi:
- 4321 (millisecondi)/1000 = 4 (secondi)
- 4321 (millisecondi)% 1000 = 321 (millisecondi)
- 321 (millisecondi) * 1000000 =00000 (nanosecondi)
Conoscendo quanto sopra, l'unica cosa che rimane è scrivere un po 'di codice C. Ci sono alcune cose che non hai diritto:
- In C, è necessario anteporre i tipi di dati struttura con
struct
. Ad esempio, invece di dire timespec
dici struct timespec
. In C++, tuttavia, non devi farlo (purtroppo secondo me).
- Non è possibile restituire strutture dalla funzione in C. Pertanto, è necessario passare una struttura tramite puntatore a una funzione che fa qualcosa con quella struttura.
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. In bocca al lupo!
fonte
2013-02-22 14:27:06
Hm, o time.h non è stato incluso correttamente o manca un punto e virgola da qualche parte sopra. – KBart
beh, questo non è il caso.Ho già esaminato l'intero codice e non ho trovato errori di questo tipo. :-( –
Ci sono più errori nel tuo codice. Non c'è nessun 'tv' dichiarato che tu tenti di restituire (suppongo che tu voglia restituire' req' invece). 'Req' non è un puntatore ma tu provi ad accedervi tramite '->'. Devi restituire 'struct timespec' invece di' timespec'. – scai