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

 
 
> Использование 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
Ответов
Сергей Борщ
сообщение Jan 24 2016, 13:28
Сообщение #2


Гуру
******

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



Полное объявление типа структуры выглядит так:
Код
typedef struct { здесь список членов } имя_типа;
В плюсах есть более короткая запись
Код
struct имя_типа { здесь список членов };

После такого объявления компилятор знает имена, размеры и взаимное расположение членов и вы можете использовать offsetof:
Код
n = offsetof(имя_типа, имя_члена);

Просто объявление struct имя_типа; - неполное (incomplete) объявление типа. После такого объявления компилятор знает, что где-то будет объявлен такой тип и что этот тип будет структурой. Что будет в этой структуре он не знает, максимум, что он может вам позволить после такого объявления - объявить указатель на эту структуру и присваивания с этим указателем. Ни содержания этой структуры, ни размера ее он не знает, поэтому даже инкремента или декремента такого указателя он сделать не может, не говоря уже о доступе к членам этой структуры.

объявление struct { список членов } имя; объявляет структуру безымянного типа и переменную "имя" этого типа. Поэтому вы не можете использовать "имя" в offsetof, ибо это имя переменной, а не типа.

В обычных Сях возможно объявление struct имя_типа { здесь список членов } имя_переменой; Здесь имя_типа - тоже неполное объявление типа, оно позволяет вставить в структуру указатель на нее же (используется для организации связанных списков), но не более того.

В первом сообщении темы нужно было объявить тип структуры и переменную этого типа:
Код
typedef struct
{
  uint16_t data0;
  uint16_t data1;
  uint16_t data2;
  uint16_t data3;
  uint16_t data4;
  uint16_t data5;
}data_test;

data_test Data_test;
struct data_test Data_test1; //можно и так, но тут ключевое слово struct избыточно
И вот после этого можно было использовать offsetof():
Код
number = offsetof(data_test, data0); // тут используется имя типа "data_test", а не имя переменной!


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- Stanislav_S   Использование offsetof, что то не получается.   Jan 24 2016, 02:59
- - GetSmart   Текст дефайна offsetof можно найти в хидерах и пон...   Jan 24 2016, 03:33
|- - Stanislav_S   Цитата(GetSmart @ Jan 24 2016, 08:33) Мож...   Jan 24 2016, 12:21
|- - GetSmart   Цитата(Stanislav_S @ Jan 24 2016, 16:21) ...   Jan 24 2016, 12:27
|- - 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
|- - 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 Текстовая версия Сейчас: 21st August 2025 - 21:16
Рейтинг@Mail.ru


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