Проблемы с объединением и памятью aligment

0

В настоящее время я работаю над портом встроенного кода (на Freescale S12), поэтому GNU и я hava проблема с профсоюзами. У меня есть следующий союз

typedef signed short        sint16;
typedef signed long         sint32;

typedef union
{
    sint32 Akku;
    sint16 AkkuHigh;
    sint16 AkkuLow;
} akku_type;

и я хочу получить доступ к самому большому 2 байту союза. Проблема в том, что оба AkkuHigh и AkkuLow имеют тот же самый стартовый адрес, что и Akku. Это похоже на компилятор. Мои вопросы: есть ли флаг компилятора, который изменяет поведение объединения? Может ли атрибут ((align (2))) помочь мне?

Заранее спасибо

  • 0
    Упакуйте high и low поля внутренней анонимной struct . Строго говоря, он не переносимый, но должен работать.
  • 1
    Почему вы ожидали, что у них будут разные адреса?
Показать ещё 2 комментария
Теги:
memory
unions

2 ответа

3

Да, все Akku, AkkuHigh, AkkuLow имеют тот же адрес. Это то, как профсоюзы работают в C. По внешнему виду вы намеревались создать союз с 32-битным членом и членом, который представляет собой структуру из двух 16-разрядных элементов. То, что вы написали, - это не способ его достижения. Попробуйте вместо этого:

typedef union
{
    sint32 Akku;
    struct s {
      sint16 AkkuHigh;
      sint16 AkkuLow;
    } representation;
} akku_type;
  • 0
    Гарантируется ли, что AkkuHigh будет AkkuHigh байтом, а AkkuLow будет AkkuLow байтом? Не мог ли компилятор решить переключить их?
  • 0
    @Unapiedra Гарантия в том, что адреса членов структуры в порядке. То, что соответствуют этим адресам, зависит от реализации (как правило, это зависит от порядкового номера целевой архитектуры. Структура, как написано, работает для большинства архитектур с прямым порядком байтов).
Показать ещё 1 комментарий
0

Правильное определение союза можно найти в этом ответе.

atribute(align(2)) определенно поможет вам, если вы скомпилируете это по 32-битной или 64-битной архитектуре. Кроме того, на 64- sizeof(sint32) составляет 8 (64 бит).

В зависимости от архитектуры архитектуры вам может потребоваться обмен AkkuHigh и AkkuLow.

  • 0
    Просто отметьте, что это допустимый C, но не C ++, хотя распространенное расширение в C ++.
  • 0
    Что именно не является допустимым C ++? Безымянная структура?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню