Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Адресация элементов массива
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
bingo
Добрый день, коллеги
Столкнулся со следующей проблемой

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

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

Заранее спасибо за ответы!
SII
Описать объединение (union), состоящее из массива uint8 и из структуры. Других возможностей совместить одно с другим на этапе компиляции нет.
novikovfb
1. Индексы требуемых ячеек надо определить через enum и пользоваться именованными константами.
2. Объявить структуру (или массив структур), объявить union этой структуры и Вашего массива, присвоить указателю на этот union адрес этого массива, пользоваться именованными полями структуры.
bingo
Спасибо за ответы!

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


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


и

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

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


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

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


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

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




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

Лучшее, что здесь подсказали.
prottoss
Цитата(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,
}


Это?
IgorKossak
Или я чего-то не понял в вопросе или я в таких случаях использую offsetof()
Правда при этом придётся у структур именованные поля выдумать (хоть бы и фиктивные), но, думаю это более функционально и переносимо, нежели вручную расставлять метки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.