2016-03-16 5 views
1

У меня есть эта функцияУ меня есть фрагмент кода, который длится от структуры FILETIME. Что это значит?

void prtduration(const FILETIME *ft_start, const FILETIME *ft_end) 
{ 
    double duration = (ft_end->dwHighDateTime - ft_start->dwHighDateTime) * 
     (7 * 60 + 9 + 496e-3) 
     + (ft_end->dwLowDateTime - ft_start->dwLowDateTime)/1e7; 
    printf("duration %.1f seconds\n", duration); 
    system("pause"); 
} 

Может кто-нибудь объяснить работу следующей части кода?

(ft_end->dwHighDateTime - ft_start->dwHighDateTime) * 
      (7 * 60 + 9 + 496e-3) 
      + (ft_end->dwLowDateTime - ft_start->dwLowDateTime)/1e7; 
+2

Если вы не знаете, что он делает, то откуда вы знаете, что он работает нормально? – user2079303

+0

Это дает мне правильный результат. На самом деле это лабораторная работа из университета, например. Но я хочу понять это целиком. –

+0

Вам нужно посмотреть определение 'FILETIME', чтобы понять это. Это не стандарт языка. ([Посмотрел вверх] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx), добавлен тег winapi.) – DevSolar

ответ

-1

- очень приблизительно частота, когда переменная FileTime меняет свое значение. А именно, каждые 7 (+ -3 или даже больше) минут он увеличивается на 1. Чем мы умножаем его на 60 для получения значения в секундах.

9 + 496e-3 - это время, которое так или иначе связано с компиляцией (с начала вывода на выход в консоли), которую мы теряем.

Действительно, это очень плохой код, и мы не должны писать так.

Однако это заставило меня лучше узнать о работе FileTime.

Спасибо всем за ответы, я очень ценю это.

5

Wow! Какой запутанный фрагмент кода. Попробуем это упростить:

// Calculate the delta 
    FILETIME delta; 
    delta.dwHighDateTime = ft_end->dwHighDateTime - ft_start->dwHighDateTime; 
    delta.dwLowDateTime = ft_end->dwLowDateTime - ft_start->dwLowDateTime; 

    // Convert 100ns units to double seconds. 
    double secs = delta.dwHighDateTime * 429.496 + delta.dwLowDateTime/1E7 

На самом деле я считаю, что это неправильно. Оно должно быть:

double secs = delta.dwHighDateTime * 429.4967296 + delta.dwLowDateTime/1E7 

Или еще более ясно:

double secs = (delta.dwHighDateTime * 4294967296. + delta.dwLowDateTime)/10E6 

Что происходит, что высокое время умножается на 2**32 (который преобразует в 100ns единиц делится на 100 нс, чтобы дать секунд.

Обратите внимание, что это еще неправильно, потому что расчет delta неправильно (так же, как и оригинал). Если в результате вычитания из недорасход нижней части, она не в состоянии s для заимствования из высокой части. См. Документацию Microsoft:

Не рекомендуется добавлять и вычитать значения из структуры FILETIME для получения относительных времен. Вместо этого вы должны скопировать части файла времени низкого и высокого порядка в структуру ULARGE_INTEGER, выполнить 64-разрядную арифметику для члена QuadPart и скопировать элементы LowPart и HighPart в структуру FILETIME.

Или, в данном случае, просто преобразуйте QuadPart, чтобы удвоить и разделить. Таким образом, мы в конечном итоге с:

ULARGE_INTEGER start,end; 
    start.LowPart = ft_start->dwLowDateTime; 
    start.HighPart = ft_start->dwHighDateTime; 
    end.LowPart = ft_end->dwLowDateTime; 
    end.HighPart = ft_end->dwHighDateTime; 

    double duration = (end.QuadPart - start.QuadPart)/1E7; 

стороне: Держу пари, причина того, что отказ одолжить никогда не был замечен в том, что код никогда не просил напечатать продолжительность больше, чем за 7 минут 9 секунд (или если он, никто не внимательно посмотрел на результат).