2014-01-09 2 views
4

Я пытаюсь рассчитать разницу между двумя time_t.
, но difftime возвращает свой первый параметр вместо разницы!
Мой код:difftime возвращает неверное значение в MinGW

#include <windows.h> 
#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 

int main(){ 
    time_t etime_t,now_t; 
    double time_diff; 
    now_t=1388525484L; 
    etime_t=1389338644L; 
    time_diff=difftime(now_t,etime_t); 
    printf("%f",time_diff); 
} 

И печатает:

1388525484.000000 

Я компиляции с GCCMinWG)
В чем проблема?

+0

ясно это #define difftime (t1, t0) (двойной) (t1 - t0) .could вас попробуйте один раз, просто распечатав «double (t1-t0)» direclty in printf() – user2760375

+1

'difftime (etime_t, now_t);'? (вы делаете предположения о реализации типа time_t плохим.) – BLUEPIXY

+0

@kripanand: вычитание в порядке! только 'difftime' терпит неудачу! – RYN

ответ

6

Ошибка MinGw. Они компилируют difftime к вызову стандартной функции окна. Однако они называют 32-разрядную версию difftime, даже если аргументы 64 бит. Это дает ожидаемый результат, поскольку он вычитает более высокую половину первого аргумента (который равен 0) из его нижней половины. См. bug report здесь. Он может быть временно скрепляются путем вставки

#define _USE_32BIT_TIME_T 1 

перед включением time.h

+0

_ "Это дает ожидаемый результат, поскольку он вычитает более высокую половину первого аргумента (который равен 0) из его нижней половины." _, Почему это так, поскольку первым аргументом является время окончания и второе время начала (таким образом, как точно работает маршалинг параметров)? Также добавление '#define _USE_32BIT_TIME_T 1' до' time.h' не всегда решает проблему. Из личного опыта я пришел к выводу, что он должен быть включен до 'stdio.h'. Не могли бы вы объяснить свой ответ, пожалуйста? – Jori

1
/*my little lab:*/ 
#include <sys/types.h> 
#include <stdio.h 
#include <time.h> 
#include <unistd.h> 
int main(void) 
{ 
time_t etime_t, now_t; 
struct tm timev_n; 
struct tm timev_e; 
struct tm *ptimev_n = &timev_n; 
struct tm *ptimev_e = &timev_e; 

double time_diff; 
now_t= 1388525484L; 
etime_t= 1389338644L; 
ptimev_n= gmtime_r(&now_t, ptimev_n); 
ptimev_e= gmtime_r(&etime_t, ptimev_e); 
printf (" now: %s \n", asctime(ptimev_n)); 
printf (" end: %s \n", asctime(ptimev_e)); 
// time_diff=difftime(now_t,etime_t); 
time_diff=difftime(etime_t, now_t); 
printf("%f \n",time_diff); 
etime_t = (time_t) time_diff; 
ptimev_e= gmtime_r(&etime_t, ptimev_e); 
printf ("back to the 70's diff: %s \n", asctime(ptimev_e)); 

return 1; 
} 

дает выход:

" Сейчас: Вт Дек 31 21:31:24 2013

конец: Пт Янв 10 7:24:04 2014

813160,000000 назад 70-е годы: Sat Jan 10 09:52:40 1970 « PLS проверить порядок параметров на difftime, может быть, ваша система имеет unsigned time_t?

Смежные вопросы