Преобразование mach_absolute_time в (нано) секунд за iOS (объектив- C) - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь написать вспомогательный метод в iOS, чтобы позволить мне использовать mach_absolute_time() в секундах (или наносекундах), чтобы я мог найти производные по времени входящие данные датчика устройства. Вот моя попытка:

#include <mach/mach_time.h>

- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
    mach_timebase_info_data_t _clock_timebase;
    double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
    return nanos / 10e9;
}

Приведенный выше код компилируется, но текущее предупреждение, которое я получаю, заключается в том, что «правильный операнд *» является значением мусора ». Кроме того, в любом случае он не дает разумного результата: /

Из того, что я прочитал, mach_absolute_time() имеет некоторые особенности, поэтому я подумал, что получение этой работы может быть полезным для других.

Вся помощь любезно получена. Спасибо

//// РЕДАКТИРОВАТЬ ////

Благодаря сверхбыстрому ответу Роба Нейпера, вот метод с включенной инициализацией:

#include <mach/mach_time.h>

- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
    mach_timebase_info_data_t _clock_timebase;
    mach_timebase_info(&_clock_timebase); // Initialize timebase_info
    double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
    return nanos / 10e9;
}

1 Ответ

1 голос
/ 23 марта 2020

Вы объявили _clock_timebase, но вы никогда не инициализировали его, поэтому он просто заполнен значениями мусора в стеке. Вы имели в виду следующее:

mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
...

Возможно, вам будет удобнее использовать AbsoluteToNanoseconds, чтобы сделать это для вас. Для полных примеров см. QA1398: Единицы абсолютного времени Маха .

Обратите внимание, что mach_timebase_info обещает быть стабильным , поэтому вы можете инициализировать это один раз, если хотите , (Если бы он не был стабильным, было бы невозможно избежать условий гонки при проверке его с существующим API, так что хорошо там ....)

...