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

typedef struct {
uint8_t arrSignal[12],
uint8_t arrDelta[24]
} data_t;

как можно получить значение sizeof для полей структуры, например для arrSignal?

var1 = sizeof(data_t.arrSignal); /* компилатор глючить */

Если ползовать

uint8_t var1 = sizeof(data_t);

будем получить ответ 36, но как обстоит дело с sizeof полями data_t?

Конечно если приложить sizeof к какой то имплементации структуры получить ответ не проблем, например:

data_t someVar; /* переменная типа data_t */
....
uint8_t var2 = sizeof(someVar.arrSignal); /* возвращает 12 */
Палыч
Оператор sizeof применим к выражениям или к именам типа. В Вашем примере data_t.arrSignal не является ни тем, ни другим. Поэтому:
sizeof(data_t) и sizeof(someVar.arrSignal) - правильно (в первом случае - имя типа; во втором - выражение)
sizeof(data_t.arrSignal) - неверно
Сергей Борщ
Компилер не глючит, а ругается совершенно правильно.
Код
typedef struct {
      uint8_t arrSignal[12];
      uint8_t arrDelta[24];
    } data_t;

    int var1 = sizeof((*(data_t *)0).arrSignal);
    int var2 = sizeof(((data_t *)0)->arrSignal);
Student2
Цитата(Палыч @ Aug 7 2009, 14:54) *
Оператор sizeof применим к выражениям или к именам типа. В Вашем примере data_t.arrSignal не является ни тем, ни другим. Поэтому:
sizeof(data_t) и sizeof(someVar.arrSignal) - правильно (в первом случае - имя типа; во втором - выражение)
sizeof(data_t.arrSignal) - неверно


Другая возможность - сделать aarSignal структура (новый тип) и тогда можно

typedef struct {
uint8_t dat[12];
} arrType_t;

typedef struct {
arrType_t arrSignal[12],
uint8_t arrDelta[24]
} data_t;

очевидно

var = sizeof(arrType_t); /* var будет 12 */

Сейчас вижу что Сергей нашел правильного ответа! Спасибо!
jorikdima
Цитата(Сергей Борщ @ Aug 7 2009, 15:17) *
Код
    int var1 = sizeof((*(data_t *)0).arrSignal);
    int var2 = sizeof(((data_t *)0)->arrSignal);

А что это за синтаксис такой? unsure.gif Что тут хоть делается?
Student2
Цитата(jorikdima @ Aug 7 2009, 16:09) *
А что это за синтаксис такой? unsure.gif Что тут хоть делается?


могу уверить что работает!

Я думаю что код делает "виртуалная имплементация" структуры - (data_t *)0 и потом все ясно.
Можно поставит (data_t *)2 и тоже будеть работать.
Палыч
Цитата(jorikdima @ Aug 7 2009, 16:09) *
А что это за синтаксис такой? unsure.gif Что тут хоть делается?
Чтобы получить размер arrSignal нужно иметь переменную типа data_t. Если такой переменной - нет, то оператор sizeof можно обмануть, записав выражение с использованием указателя на переменную типа data_t. В качестве указателя используется константа равная нулю, приведенная к типу data_t *.
Student2
Цитата(Палыч @ Aug 7 2009, 17:02) *
Чтобы получить размер arrSignal нужно иметь переменную типа data_t. Если такой переменной - нет, то оператор sizeof можно обмануть, записав выражение с использованием указателя на переменную типа data_t. В качестве указателя используется константа равная нулю, приведенная к типу data_t *.


Можно ползовать всякое число для константы (я пробовал с 2 и 20 - работает). Для меня ето виртуалная имплементация типа для какой то константой, после етого sizeof работатет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.