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

 
 
 
Reply to this topicStart new topic
> Адресация элементов массива, Не по индексу, а по имени/метке и т.п.
bingo
сообщение Apr 19 2017, 03:01
Сообщение #1


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

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Добрый день, коллеги
Столкнулся со следующей проблемой

Необходима синтаксическая конструкция в Си для адресации некоторых элементов массива по метке (позиция известна при компиляции), а не по индексу.
В массиве хоть и хранятся структуры, но описывается он как массив uint8!!
Массив и структуры в нем определяются API откомпилированной библиотеки, поэтому сильно изменять (чтобы появились у структур именованные поля) не могу!

Сейчас приходится часто менять этот большой массив, поэтому приходится вручную пересчитывать номер позиции в массиве, куда будут в дальнейшем будут писаться байты.

Заранее спасибо за ответы!

Сообщение отредактировал bingo - Apr 19 2017, 04:30
Go to the top of the page
 
+Quote Post
SII
сообщение Apr 19 2017, 04:34
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Описать объединение (union), состоящее из массива uint8 и из структуры. Других возможностей совместить одно с другим на этапе компиляции нет.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Apr 19 2017, 04:37
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



1. Индексы требуемых ячеек надо определить через enum и пользоваться именованными константами.
2. Объявить структуру (или массив структур), объявить union этой структуры и Вашего массива, присвоить указателю на этот union адрес этого массива, пользоваться именованными полями структуры.
Go to the top of the page
 
+Quote Post
bingo
сообщение Apr 19 2017, 05:25
Сообщение #4


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

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Спасибо за ответы!

Такой подход с union обсуждался.
Но, в случае изменений структуры массива требуется корректировка и union
Т.е в двух местах!
Возможна путаница


Что касается enum, то не совсем понимаю как это применить у меня, т.к. индексы хоть известны при компиляции, но они же изменятся
при коррекции структуры массива. И надо будет вносить изменения в enum..
Это не лучше чем простой индекс..
Go to the top of the page
 
+Quote Post
mantech
сообщение Apr 19 2017, 06:55
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(bingo @ Apr 19 2017, 06:01) *
Массив и структуры в нем определяются API откомпилированной библиотеки, поэтому сильно изменять (чтобы появились у структур именованные поля) не могу!


и

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

Дак меняется тип структуры или нет? Вы определитесь сначала с исходными требованиями для задачи..

Сообщение отредактировал mantech - Apr 19 2017, 06:57
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 19 2017, 07:08
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца?
Go to the top of the page
 
+Quote Post
bingo
сообщение Apr 19 2017, 08:56
Сообщение #7


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

Группа: Свой
Сообщений: 88
Регистрация: 9-04-12
Пользователь №: 71 256



Цитата(ViKo @ Apr 19 2017, 10:08) *
Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца?


Ответ прост. Я выше писал.

Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.
Но сами содержимое этого массива (определяется спецификацией пакета) - это несколько структур данных, которые я сейчас при отладке не редко переставляю/изменяю.
Соответственно меняется цифровой индекс нужных мне байт и приходится вручную пересчитывать новое положение элемента массива.


В прототипе функции - это только массив байт без объявления структур с именованными полями!

Сообщение отредактировал bingo - Apr 19 2017, 08:59
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 19 2017, 09:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(bingo @ Apr 19 2017, 08:25) *
Но, в случае изменений структуры массива требуется корректировка и union
Т.е в двух местах!
Возможна путаница

Когда не хочется "в двух местах", на помощь приходит X macro. Почитайте на досуге.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 19 2017, 09:50
Сообщение #9


Гуру
******

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



QUOTE (bingo @ Apr 19 2017, 11:56) *
Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.
Сделайте функцию-обертку, которая принимает указатель на структуру, приводит его к указателю на байты и вызывает библиотечную функцию.


--------------------
На любой вопрос даю любой ответ
"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
Olej
сообщение Apr 19 2017, 10:40
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(bingo @ Apr 19 2017, 11:56) *
Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.
Но сами содержимое этого массива (определяется спецификацией пакета) - это несколько структур данных, которые я сейчас при отладке не редко переставляю/изменяю.
Соответственно меняется цифровой индекс нужных мне байт и приходится вручную пересчитывать новое положение элемента массива.




Цитата(Сергей Борщ @ Apr 19 2017, 12:50) *
Сделайте функцию-обертку, которая принимает указатель на структуру, приводит его к указателю на байты и вызывает библиотечную функцию.

Лучшее, что здесь подсказали.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Apr 19 2017, 10:44
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(bingo @ Apr 19 2017, 09:01) *
Сейчас приходится часто менять этот большой массив, поэтому приходится вручную пересчитывать номер позиции в массиве, куда будут в дальнейшем будут писаться байты.

Код
#define ITEM_1 0
#define ITEM_2 1
#define ITEM_3 2


uint8_t bArray[] =
{
[ITEM_1] = 10,
[ITEM_2] = 20,
[ITEM_3] = 30,
}


Это?


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 19 2017, 19:12
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Или я чего-то не понял в вопросе или я в таких случаях использую offsetof()
Правда при этом придётся у структур именованные поля выдумать (хоть бы и фиктивные), но, думаю это более функционально и переносимо, нежели вручную расставлять метки.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 13:09
Рейтинг@Mail.ru


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