реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Объявление структуры.
SasaVitebsk
сообщение May 3 2010, 19:22
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Столкнулся с интересной вещью. С чем-то подобным уже сталкивался, но в явном виде пока не встречал.

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

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

Вот не совсем понятно. Представим, что я просто ошибся и не проинициализировал последний элемент структуры и к нему нет прямого обращения .... и вот - нет ошибки, а компилятор этот элемент просто выкинет.
Где это описано? Как то в явном виде не встречал.
Go to the top of the page
 
+Quote Post
Methane
сообщение May 3 2010, 19:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



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

А ошибки-то нет. С точки зрения С. Тоже с выравниванием. Но глюк можно поймать, грандиознейший. Я обычно делаю union в котором есть массивы u8, u16, u32, ну и сама структура.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 3 2010, 19:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Да, похоже я просто погорячился. На неполную инициализацию действительно компилятор не реагирует, а с sizeof - это всётаки, похоже, моя простая ошибка.
Так что извиняюсь.
laughing.gif
Go to the top of the page
 
+Quote Post
Methane
сообщение May 3 2010, 19:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



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

Не понял. Поясните. sizeof структуры не обязан быть равен сумме полей структуры, особенно если оно не __packed___
Go to the top of the page
 
+Quote Post
theBMV
сообщение May 20 2010, 06:45
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



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

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

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

зюыю кст. работаю тоже в ИАРЕ 5ю40
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 20 2010, 07:39
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Ошибка была простая - моя. Я в головном файле объявлял структуру одним образом, а при объявлении структуры extended объявлял другим. smile.gif
Всё от лености ква-ква. Когда находишь такие ошибки, то вносишь коренные изменения. Теперь объявил новый тип в файле объявлений.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016