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

 
 
> Как получить sizeof для полей структуры
Student2
сообщение Aug 7 2009, 09:55
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Если имеем структура:

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 */
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Палыч
сообщение Aug 7 2009, 11:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Оператор sizeof применим к выражениям или к именам типа. В Вашем примере data_t.arrSignal не является ни тем, ни другим. Поэтому:
sizeof(data_t) и sizeof(someVar.arrSignal) - правильно (в первом случае - имя типа; во втором - выражение)
sizeof(data_t.arrSignal) - неверно
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 7 2009, 12:17
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Компилер не глючит, а ругается совершенно правильно.
Код
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);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 7 2009, 12:19
Сообщение #4


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Цитата(Палыч @ 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 */

Сейчас вижу что Сергей нашел правильного ответа! Спасибо!

Сообщение отредактировал Student2 - Aug 7 2009, 12:21
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Aug 7 2009, 13:09
Сообщение #5


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Сергей Борщ @ Aug 7 2009, 15:17) *
Код
    int var1 = sizeof((*(data_t *)0).arrSignal);
    int var2 = sizeof(((data_t *)0)->arrSignal);

А что это за синтаксис такой? unsure.gif Что тут хоть делается?
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 7 2009, 13:58
Сообщение #6


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



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


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

Я думаю что код делает "виртуалная имплементация" структуры - (data_t *)0 и потом все ясно.
Можно поставит (data_t *)2 и тоже будеть работать.

Сообщение отредактировал Student2 - Aug 7 2009, 14:01
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 7 2009, 14:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(jorikdima @ Aug 7 2009, 16:09) *
А что это за синтаксис такой? unsure.gif Что тут хоть делается?
Чтобы получить размер arrSignal нужно иметь переменную типа data_t. Если такой переменной - нет, то оператор sizeof можно обмануть, записав выражение с использованием указателя на переменную типа data_t. В качестве указателя используется константа равная нулю, приведенная к типу data_t *.
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 7 2009, 14:10
Сообщение #8


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Цитата(Палыч @ Aug 7 2009, 17:02) *
Чтобы получить размер arrSignal нужно иметь переменную типа data_t. Если такой переменной - нет, то оператор sizeof можно обмануть, записав выражение с использованием указателя на переменную типа data_t. В качестве указателя используется константа равная нулю, приведенная к типу data_t *.


Можно ползовать всякое число для константы (я пробовал с 2 и 20 - работает). Для меня ето виртуалная имплементация типа для какой то константой, после етого sizeof работатет.

Сообщение отредактировал Student2 - Aug 7 2009, 14:11
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:47
Рейтинг@Mail.ru


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