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

 
 
> Использование offsetof, что то не получается.
Stanislav_S
сообщение Jan 24 2016, 02:59
Сообщение #1


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Итак имеем структуру для теста:
CODE
struct
{
uint16_t data0;
uint16_t data1;
uint16_t data2;
uint16_t data3;
uint16_t data4;
uint16_t data5;
}Data_test;

static uint8_t number;


Далее в программе пытаюсь посмотреть:

CODE
number = offsetof(Data_test, data0);


Получаю в ответ:

CODE
Error[Pe029]: expected an expression C:\Project for ARM\LBR004_V1\Sources\main.c 69
Error[Pe028]: expression must have a constant value C:\Project for ARM\LBR004_V1\Sources\main.c 69
Error[Pe018]: expected a ")" C:\Project for ARM\LBR004_V1\Sources\main.c 69


Компилятор IAR ARM, статьи читал, что делаю не так, или я чего то не понял?

smile3046.gif help.gif



--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jan 24 2016, 03:33
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Текст дефайна offsetof можно найти в хидерах и понять как он работает. В offsetof первым аргументом задаётся ТИП структуры. А не сама структура. Обычно перед объявлением структуры (как переменной) объявляется её тип внутри typedef. При объявлении структур (как типа или переменной) можно задаеть ещё один идентификатор, относящийся к типу, сразу после слова struct. Получится struct name1 {...} name2. В дальнейшем name1 с предворяющим словом struct будет означать тип структуры, в которой имя объявлено. Тогда можно написать number = offsetof(struct name1, data0); Естественно, имя name1 заменить на более подходящее.

Уточню, что в компиляторе не проверял. Может быть какой-то заругается, если не реализовали приведение к типу структур вида (struct name).

Сообщение отредактировал GetSmart - Jan 24 2016, 13:13


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Jan 24 2016, 12:21
Сообщение #3


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(GetSmart @ Jan 24 2016, 08:33) *
Можно попробовать написать number = offsetof(struct name1, data0);

Естественно, имя name1 лучше заменить на более подходящее.

Уточню, что в компиляторе не проверял. Может быть заругается, т.к. не реализовали.


В хидере stddef.h макрос описан так:
CODE
#define offsetof(T, member) (__INTADDR__((&((T *)0)->member)))


Пробовал и такой способ - number = offsetof(struct name1, data0); , то же ругается - Error[Pe393]: pointer to incomplete class type is not allowed.
В статьях люди его используют, точно в так же как и я пытаюсь, но вот результат почему - то разный smile3046.gif


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 12:27
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Stanislav_S @ Jan 24 2016, 16:21) *
В статьях люди его используют, точно в так же как и я пытаюсь, но вот результат почему - то разный smile3046.gif

К примеру в вики непонятно написано о offsetof. Если этот оператор не встроенный в компилятор (не обязан быть встроенным по стандарту) и всегда работает через дефайн, то в него ну никак первым аргументом нельзя передать переменную-структуру или юнион. А если бы оператор был встроенным, то в зависимости от реализации.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Stanislav_S   Использование offsetof, что то не получается.   Jan 24 2016, 02:59
|- - Stanislav_S   Ну вот например - offsetof - embedded, по этой ста...   Jan 24 2016, 12:44
- - GetSmart   Вариант из первого поста этой ветки будет работать...   Jan 24 2016, 13:16
|- - Stanislav_S   Цитата(GetSmart @ Jan 24 2016, 18:16) Вар...   Jan 24 2016, 13:34
- - Сергей Борщ   Полное объявление типа структуры выглядит так: Код...   Jan 24 2016, 13:28
|- - GetSmart   Цитата(Сергей Борщ @ Jan 24 2016, 17:28) ...   Jan 24 2016, 13:40
||- - Сергей Борщ   Цитата(GetSmart @ Jan 24 2016, 15:40) Пол...   Jan 24 2016, 13:50
||- - GetSmart   Цитата(Сергей Борщ @ Jan 24 2016, 17:50) ...   Jan 24 2016, 13:55
|||- - Сергей Борщ   Цитата(GetSmart @ Jan 24 2016, 15:55) Ста...   Jan 24 2016, 14:02
|||- - GetSmart   Цитата(Сергей Борщ @ Jan 24 2016, 18:02) ...   Jan 24 2016, 14:12
||- - zltigo   QUOTE (Сергей Борщ @ Jan 24 2016, 15:50) ...   Jan 24 2016, 14:23
|- - Stanislav_S   Цитата(Сергей Борщ @ Jan 24 2016, 18:28) ...   Jan 24 2016, 13:40
- - GetSmart   Какие ваши доказательства? Речь не о удобстве, а...   Jan 24 2016, 14:30
- - GetSmart   Странно. Если sizeof "дружит" со struct ...   Jun 8 2016, 03:56


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 21:24
Рейтинг@Mail.ru


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