Questo è leggermente diverso, ma credo che chiaramente illustra la logica coinvolta. Sto lavorando su un codice MSP430 in C, e ho una struttura timestamp molto simile al tempo, ma con nsecs anziché usecs.
Questo codice mantiene tutto positivo, quindi gli interi non firmati funzionerebbero bene ed eviterà overflow (penso). Inoltre, non modifica i timestamp/i messaggi di tempo che vengono inoltrati, ad eccezione ovviamente del risultato.
typedef struct timestamp {
int32_t secs;
int32_t nsecs;
} timestamp_t;
int timestamp_sub(timestamp_t * x, timestamp_t * y, timestamp_t * result){
// returns 1 if difference is negative, 0 otherwise
// result is the absolute value of the difference between x and y
negative = 0;
if(x->secs > y->secs){
if(x->nsecs > y->nsecs){
result->secs = x->secs - y->secs;
result->nsecs = x->nsecs - y->nsecs;
}else{
result->secs = x->secs - y->secs - 1;
result->nsecs = (1000*1000*1000) - y->nsecs + x->nsecs;
}
}else{
if(x->secs == y->secs){
result->secs = 0;
if(x->nsecs > y->nsecs){
result->nsecs = x->nsecs - y->nsecs;
}else{
negative = 1;
result->nsecs = y->nsecs - x->nsecs;
}
}else{
negative = 1;
if(x->nsecs > y->nsecs){
result->secs = y->secs - x->secs - 1;
result->nsecs = (1000*1000*1000) - x->nsecs + y->nsecs;
}else{
result->secs = y->secs - x->secs;
result->nsecs = y->nsecs - x->nsecs;
}
}
}
return negative;
}
Grazie per il suggerimento, ma sto già utilizzando il codice. In realtà, ho appena capito qual era il mio problema. Grazie per aver controllato Google, è probabilmente la prima cosa che avrei postato come risposta. =) –
Per chiarire, mi sono reso conto che i tempi erano inizializzati per avere valori di 'tv_sec' e' tv_usec' di 0. L'uso di 'gettimeofday()' per inizializzare correttamente le code ha risolto il problema. Grazie per il supporto. =) –
2Shelly, aggiungerei che IMHO è meglio cambiare la seconda condizione nel seguente modo 'x-> tv_usec - y-> tv_usec> = 1000000' per convertire il tempo come' 5/1000000' in '6/0 '. – Kolyunya