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

 
 
> iar struct union как указать смещение?
AndryG
сообщение Feb 14 2015, 20:10
Сообщение #1


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Имеем, для примера, вот такой тип данных, в котором хотим обеспечить к массиву данных доступ к нужным полям по разному "подходу".

Код
typedef union{
  uint8_t raw[4]; // head, bodyA, bodyB, tail
  struct{
    uint8_t b;
  } body;
  uint8_t bodyA;
  uint8_t tail;
} my_t


Понятно, что всё работает неверно. Вопрос: возможно ли указать полям дополнительно смещение? Если да, то как ?

Совет "расположи поля в объединении в нужном порядке" не предлагать. Это лишь пример для обяъснения проблемы. В моем случае необходимо именно указать смещение.

Единственный вариант вижу в объявлении дополнительным полей-проставок, которые будут смещать на нужное место поля. Но и то сработает не везде.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndryG
сообщение Feb 15 2015, 19:11
Сообщение #2


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Цитата
Опишите почему вам понятно "что работает неверно".


my_t.body.b ссылается на байт "bodyA" (см. коммент raw[]), а по смыслу должно на "bodyB"
my_t.bodyA ссылается на "head", а ожидается (из названия) на второй байт "bodyA"
my_t.tail ссылается на "head", а ожидается (из названия) на четвертый байт "tail"

megajohn, в вашем примере t.s.body.b = 2; t.s.bodyA = 3 неверно ссылаются.


У меня есть массив данных. Одна функция работает со всем массивом data[].
Второй функции интересны в этом массиве только некоторые участки (первый, пятый, девятый-десятый байты, для примера)
Третья должна видеть этот массив сосвсем иначе...
Вот я и хочу сделать объединение:
Код
union{
  raw[10]
  v1: struct{
    b1 -- указывает на верное место
    b5 -- указывает на второй байт, а хочется на пятый
    w5-- указывает на третий байт, а хочется на девятый
  }
}

Другими словами, я хочу указать полю структуры адрес (относительно его головы).

SSerge с превращением объединения в структуру это вы верно подметили sm.gif

Раз звучат только уточняющие вопросы, значит я слишком много хочу...

Go to the top of the page
 
+Quote Post
megajohn
сообщение Feb 16 2015, 07:32
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(AndryG @ Feb 15 2015, 22:11) *
У меня есть массив данных. Одна функция работает со всем массивом data[].
Второй функции интересны в этом массиве только некоторые участки (первый, пятый, девятый-десятый байты, для примера)
Третья должна видеть этот массив сосвсем иначе...


дык зачем огород городить с этим Union ?
так и пишите

uint8_t raw[] = "\x01\x02\x03\x04";

typedef struct{
uint8_t head;
uint8_t dummy[3];
}Sdata_view_1;

typedef struct{
uint8_t dummy[2];
uint8_t body;
}Sdata_view_2;

func1( (Sdata_view_1*)raw );
func2( (Sdata_view_2*)raw );

bool func1( (Sdata_view_1* data )
{
return ( data-> head == 1);
}

bool func2( (Sdata_view_2* data )
{
return ( data->body == 'a' );
}




--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AndryG   iar struct union как указать смещение?   Feb 14 2015, 20:10
- - kolobok0   Цитата(AndryG @ Feb 14 2015, 23:10) ...По...   Feb 15 2015, 10:28
- - SSerge   Цитата(AndryG @ Feb 15 2015, 03:10) Вопро...   Feb 15 2015, 10:45
- - megajohn   Цитата(AndryG @ Feb 14 2015, 23:10) Понят...   Feb 15 2015, 17:58
||- - Сергей Борщ   Цитата(megajohn @ Feb 16 2015, 09:32) дык...   Feb 16 2015, 07:57
|- - scifi   Цитата(AndryG @ Feb 15 2015, 22:11) У мен...   Feb 16 2015, 08:23
|- - kolobok0   Цитата(AndryG @ Feb 15 2015, 22:11) ...Ра...   Feb 16 2015, 09:26
- - SSerge   Кодtypedef union{ uint8_t raw[4]; // hea...   Feb 15 2015, 20:08
- - AndryG   megajohn, вот и я кроме как вставлять "распор...   Feb 16 2015, 10:32
|- - scifi   Цитата(AndryG @ Feb 16 2015, 13:32) Вмест...   Feb 16 2015, 10:39
|- - kolobok0   Цитата(AndryG @ Feb 16 2015, 13:32) ...Я ...   Feb 17 2015, 21:46
|- - SSerge   Цитата(kolobok0 @ Feb 18 2015, 04:46) И п...   Feb 18 2015, 12:40
- - AndryG   scifi, да я ради интереса включил MISRA посмотреть...   Feb 16 2015, 10:55
|- - scifi   Цитата(AndryG @ Feb 16 2015, 13:55) Вот я...   Feb 16 2015, 11:17
- - AndryG   SSerge, именно из-за разных форматов я хочу переда...   Feb 18 2015, 12:58


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:31
Рейтинг@Mail.ru


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