2015-06-03 3 views
0

Я использую библиотеку, передает мне указатель на массив из int32_T. Мне нужно сделать некоторую математику по этим номерам, но данные фактически находятся в формате Q23.8.Интегрированный массив массива в массив классов

Я создал класс, перегружающий основные математические операторы, но я застрял в том, как отличить указатель массива int32_t к моему новому классу - типы данных имеют разные размеры. Есть ли способ заставить мой новый класс соответствовать размеру int32_t, или есть ли другой способ сделать это?

Примечание: Я хочу избежать копирования каждого элемента этого большого массива, поскольку я разрабатываю систему с ограниченными ресурсами.

+0

В вашем классе есть конструктор, который принимает int32_t. Затем вы можете использовать один элемент массива для своего класса, чтобы работать на нем. – Aumnayan

ответ

1

Прежде всего, обратите внимание, что если вы не ограничены производительностью, только по потреблению памяти, решение, предлагаемое @Aumnayan, может быть предпочтительным для простоты и переносимости.

Для того, чтобы заставить свои объекты в соответствии с размером int32_t и выравнивание Q23.8 вы можете использовать битовые поля:

struct Q_23_8 
{ 
    int32_t fractional : 8; 
    int32_t integral : 23; 
}; 

static_assert(sizeof(Q_23_8) == sizeof(int32_t), "Sizes differ!"); 

Пожалуйста, обратите внимание, что порядок полей зависит от целевого процессора байтов; образец для малочисленных. Кроме того, чтобы обеспечить размер вашего класса, вам может понадобиться использовать возможности управления упаковкой и выравниванием вашего компилятора (например, #pragma pack).

Имея int32_t encoded[] вы можете интерпретировать его как массив Q_23_8 следующим образом:

Q_23_8* decoded = reinterpret_cast<Q_23_8*>(encoded); 

Вот полный пример кода: http://ideone.com/X177fQ. Я настоятельно рекомендую reading more about bit-fields, их переносимость и ограничения.

+0

Отлично, спасибо! – sbell

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