Опять union..., как определить структуру
От: Rius Россия  
Дата: 20.09.05 06:04
Оценка:
как реализовать в C3 структуру типа:
union
{
 float f;
 char c[4];
}

нужно для перестановки байт, т.к. устройство передает float в нестандартном виде.
также передается массив из 64 байт, который нужно разобрать, делалось таким способом:

typedef struct CMD246
{
   union
  {
    BYTE                   Data[64];
    tEEPROMCAL_BLOCK1      sEEPROM;
  };

} _CMD246;
typedef struct EEPROMCAL_BLOCK1
{
    char    String[16];
    float   f1;
    float   f2;
    float   f3;
    float   f4;
    float   f5;
    float   f6;
    float   f7;
    float   f8;
    float   f9;
    float   f10;
    unsigned short int AccMin;
    unsigned short int AccMAx;
    float   TempCode;
} tEEPROMCAL_BLOCK1;

как это делать теперь?
Re: Опять union..., как определить структуру
От: Mab Россия http://shade.msu.ru/~mab
Дата: 20.09.05 06:12
Оценка: 6 (1)
Здравствуйте, Rius, Вы писали:

Можно воспользоваться атрибутом StructLayout, сказав LayoutKind.Explicit и явно указав размер. Далее, на члены навесить атрибут FieldOffset.

Для описания массивов удобно пользоваться синтаксисом fixed arrays (введенным во FW2.0). Если пишется под FW1.1, то придется объявить лишь первый элемент массива, а доступ к произвольному элементу получать через адресную арифметику.

P.S. Все это unsafe, конечно.
Re[2]: Опять union..., как определить структуру
От: Rius Россия  
Дата: 20.09.05 12:56
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, Rius, Вы писали:


Mab>Можно воспользоваться атрибутом StructLayout, сказав LayoutKind.Explicit и явно указав размер. Далее, на члены навесить атрибут FieldOffset.


Mab>Для описания массивов удобно пользоваться синтаксисом fixed arrays (введенным во FW2.0). Если пишется под FW1.1, то придется объявить лишь первый элемент массива, а доступ к произвольному элементу получать через адресную арифметику.


Mab>P.S. Все это unsafe, конечно.


И на том спасибо
Re[2]: Опять union..., как определить структуру
От: YuriyAG Франция  
Дата: 25.07.08 17:37
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Можно воспользоваться атрибутом StructLayout, сказав LayoutKind.Explicit и явно указав размер. Далее, на члены навесить атрибут FieldOffset.


Mab>Для описания массивов удобно пользоваться синтаксисом fixed arrays (введенным во FW2.0). Если пишется под FW1.1, то придется объявить лишь первый элемент массива, а доступ к произвольному элементу получать через адресную арифметику.


Mab>P.S. Все это unsafe, конечно.


Cпасибо большое за ответ, я его нашёл поиском. Меня интересует тот-же вопрос. Сделать простой union float / int благодаря вашему совету у меня получилось:
[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[FieldOffset(0)]
public float fltval;

[FieldOffset(0)]
public System.Int16 intval;
}
он работает,

а вот ввести в union массив не выходит. Попробовал вот такое:
[StructLayout(LayoutKind.Explicit)]
struct TestUnion1
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] fixedArray;

[FieldOffset(0)]
public float fltval;
}
но вылетает ексепшн.
Найти что-то про fixed arrays в FW2.0 тоже почему-то не получается..

Спасибо большое заранее за любую подсказку или ссылку по этой теме.
Re[2]: Опять union..., как определить структуру
От: YuriyAG Франция  
Дата: 25.07.08 18:30
Оценка:
Простите, предыдущий мой вопрос снимается, разобрался, спасибо ещё раз !

[StructLayout(LayoutKind.Explicit)]
struct TestUnion1
{
[FieldOffset(0)]
unsafe public fixed byte fixedArray[4];

[FieldOffset(0)]
public float fltval;
}


unsafe static void Main(string[] args)
{
TestUnion1 tu1_t = new TestUnion1();
tu1_t.fixedArray[0] = 5;
tu1_t.fixedArray[1] = 4;
tu1_t.fixedArray[2] = 3;
tu1_t.fixedArray[3] = 2;
Console.WriteLine(tu1_t.fltval);

TestUnion1 tu1_t1 = new TestUnion1();
tu1_t1.fltval = tu1_t.fltval;
Console.WriteLine(tu1_t1.fixedArray[0].ToString() + tu1_t1.fixedArray[1].ToString()
+ tu1_t1.fixedArray[2].ToString() + tu1_t1.fixedArray[3].ToString());
return;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.