2013-02-22 15 views
6

Desidero convertire i millisecondi in struttura timespec di GNU (GCC) linux. Ho provato a seguire il codice per lo stesso.Conversione di millisecondi in timespec - GNU Porting

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

L'esecuzione di questo codice mi dà il seguente errore.

atteso ‘=’, ‘’, ‘;’, ‘asm’ o ‘__attribute__’ prima ‘GetTimeSpecValue’

Ho anche includere time.h file nel codice.

+0

Hm, o time.h non è stato incluso correttamente o manca un punto e virgola da qualche parte sopra. – KBart

+0

beh, questo non è il caso.Ho già esaminato l'intero codice e non ho trovato errori di questo tipo. :-( –

+4

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

risposta

11

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:

  1. 4321 (millisecondi)/1000 = 4 (secondi)
  2. 4321 (millisecondi)% 1000 = 321 (millisecondi)
  3. 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:

  1. 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).
  2. 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!

+0

Non sarebbe meglio/più veloce usare 'ts-> tv_nsec = (ms - (ts-> tv_sec * 1000)) * 1000000', mod è un'operazione lenta, specialmente sui processori che non hanno un FPU hardware – Geoffrey

+0

Va notato che alcune funzioni, come pthread_mutex_cond_timedwait, usano un timestamp in tv_sec ... questo mi ha fatto grattarmi la testa per un po '. – Geoffrey

+0

Mi è piaciuta la tua spiegazione! – jafarmlp

2

provare questo:

struct timespec GetTimeSpecValue(unsigned long millisec) { 
    struct timespec req; 
    req.tv_sec= (time_t)(millisec/1000); 
    req.tv_nsec = (millisec % 1000) * 1000000; 
    return req; 
} 

Non credo struct timespec è typedef'ed, quindi è necessario anteporre timespec con struct. E risolvi la nano seconda parte se vuoi essere preciso. Si noti che req non è un puntatore. Pertanto ai membri non è possibile accedere con "->"

+1

Se riceve solo millisecondi come input, non può calcolare alcun nanosecondo :). – scai

+0

Vero :) ma può aggiornare tv_nsec nel modo più preciso possibile, dato che l'input è milli secondi. Lo aggiusterò nel mio post – hetepeperfan

+0

Non l'ho usato per nano secondo..e ho corretto il mio errore e il tuo aiuto ha fatto il trucco..grazie mille –