Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объявление структуры.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
SasaVitebsk
Столкнулся с интересной вещью. С чем-то подобным уже сталкивался, но в явном виде пока не встречал.

Компилятор IAR ARM 5.40.
Объявляю структуру. Мне надо чтобы структура была определённого размера, так как далее я работаю с указателеми и смещениями. Поэтому в конец я добавляю некоторые неиспользуемые поля. Структуру инициализирую.

==========
Если инициализировать структуру не полностью (то есть не все поля), то компилятор игнорирует поля, которые неинициализированы. При этом значение sizeof выдаётся по фактическому значению размера структуры. Ни ошибки, ни предупреждения компилятор при этом не выдаёт.

Вот не совсем понятно. Представим, что я просто ошибся и не проинициализировал последний элемент структуры и к нему нет прямого обращения .... и вот - нет ошибки, а компилятор этот элемент просто выкинет.
Где это описано? Как то в явном виде не встречал.
Methane
Цитата(SasaVitebsk @ May 3 2010, 22:22) *
Если инициализировать структуру не полностью (то есть не все поля), то компилятор игнорирует поля, которые неинициализированы. При этом значение sizeof выдаётся по фактическому значению размера структуры. Ни ошибки, ни предупреждения компилятор при этом не выдаёт.

А ошибки-то нет. С точки зрения С. Тоже с выравниванием. Но глюк можно поймать, грандиознейший. Я обычно делаю union в котором есть массивы u8, u16, u32, ну и сама структура.
SasaVitebsk
Да, похоже я просто погорячился. На неполную инициализацию действительно компилятор не реагирует, а с sizeof - это всётаки, похоже, моя простая ошибка.
Так что извиняюсь.
laughing.gif
Methane
Цитата(SasaVitebsk @ May 3 2010, 22:43) *
Да, похоже я просто погорячился. На неполную инициализацию действительно компилятор не реагирует, а с sizeof - это всётаки, похоже, моя простая ошибка.
Так что извиняюсь.
laughing.gif

Не понял. Поясните. sizeof структуры не обязан быть равен сумме полей структуры, особенно если оно не __packed___
theBMV
Мне обычно помогает в хедере определить НОВЫЙ ТИП
Код
#pragma pack(1)
typedef struct S_имя
{
  бла;
  бла;
  бла;
} T_имя;
#pragma pack()

...и далее в коде
Код
T_имя имя_переменной;

т.е. без инициализации.

зюыю кст. работаю тоже в ИАРЕ 5ю40
SasaVitebsk
Да я не делаю упаковку. Мы как-бы в железе работаем. То есть процессор не поменяется на ходу. А эффективност явно будет выше при структуре, выравненной как положено. При передаче структуры от устройства к устройству, её просто можно выравнять под свою архитектуру. Законы выравнивания - заранее известны.

Ошибка была простая - моя. Я в головном файле объявлял структуру одним образом, а при объявлении структуры extended объявлял другим. smile.gif
Всё от лености ква-ква. Когда находишь такие ошибки, то вносишь коренные изменения. Теперь объявил новый тип в файле объявлений.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.