Typecasting Int32 для sCplx16 IQ образцов в C - PullRequest
0 голосов
/ 18 ноября 2010

У меня следующая проблема

У меня есть структура

typedef struct
{

    Int16 real;
    Int16 imag;

}sCplx16;

Int32 Data; //Data has real-imag packed into 32 bits. real-imag are 16 bits each.

Теперь я получаю Int32 Value вместе с Real-Imag, упакованным вместе. Я уже написал функцию, которая принимает аргумент sCplx16, и я не хочу делать его Int32, поскольку внутри функции будет множество изменений.

Чтобы избежать этого, я набрал переменную

Fun( (sCplx16)Data);


fun.c

Fun(sCplx16 DataPtr)

{  

   //

}


Inside the function, I find that value received are mapped correctly to
DataPtr.real and DataPtr.imag.

Is this typecasting correct? Someone told me that it will vary with compiler.
meaning imaginary will be first 16 bits and real will be next 16 bits.

Я думаю, что на это влияет только порядок байтов, а не компилятор

Пожалуйста, поделитесь своим мнением

Спасибо

Ответы [ 3 ]

0 голосов
/ 18 ноября 2010

Вы не можете полагаться на то, что внутри структуры нет заполнения, "наложение" таких полей безопасно только для первого поля. Выясните, можно ли сказать вашему компилятору (ам) не заполнять структуру (атрибут иногда называют «упакованным»), а также добавьте код, который проверяет, что sizeof (sCplx16) - это то, что вы ожидаете, то есть 32 / CHAR_BIT.

0 голосов
/ 19 ноября 2010

Две проблемы, связанные с приведением типов:

  • Endianness.Если вы перенесете код на компьютер с другим порядком байтов, упакованные данные больше не будут корректно отображаться в полях структуры.
  • Различия в размере.Если sizeof(sCplx16) != sizeof(Int32), то пока неизвестно, как получится отображение.Это различие может возникнуть из-за того, что Int16 имеет ширину не совсем 16 бит, или, возможно, в результате заполнения между элементами структуры (хотя это маловероятно, если они имеют одинаковый тип. Только произвольно сложный компилятор добавит такие ненужные дополнения)

Самый простой способ получить полностью переносимый код - написать небольшую функцию, которая преобразует упакованное представление в структуру:

sCplx16 unpack(Int32 data)
{
  sCplx16 result = { (data >> 16) & 0xFFFF, data & 0xFFFF };
  return result;
}

Затем вы можете вызвать вашу функцию как Fun(unpack(Data));

0 голосов
/ 18 ноября 2010

Я не уверен насчет того, как компилятор работает с типизацией для функции с передачей значения. Но если вы измените функцию так, чтобы она передавала указатель на int32, то насколько я знаю, на нее влияет только порядок байтов.

...