Перейти к содержанию
    

Адресация элементов массива

Добрый день, коллеги

Столкнулся со следующей проблемой

 

Необходима синтаксическая конструкция в Си для адресации некоторых элементов массива по метке (позиция известна при компиляции), а не по индексу.

В массиве хоть и хранятся структуры, но описывается он как массив uint8!!

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

 

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

 

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

Изменено пользователем bingo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Описать объединение (union), состоящее из массива uint8 и из структуры. Других возможностей совместить одно с другим на этапе компиляции нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

2. Объявить структуру (или массив структур), объявить union этой структуры и Вашего массива, присвоить указателю на этот union адрес этого массива, пользоваться именованными полями структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Такой подход с union обсуждался.

Но, в случае изменений структуры массива требуется корректировка и union

Т.е в двух местах!

Возможна путаница

 

 

Что касается enum, то не совсем понимаю как это применить у меня, т.к. индексы хоть известны при компиляции, но они же изменятся

при коррекции структуры массива. И надо будет вносить изменения в enum..

Это не лучше чем простой индекс..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

и

 

"Такой подход с union обсуждался.

Но, в случае изменений структуры массива требуется корректировка и union

Т.е в двух местах!"

 

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца?

 

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

 

Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.

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

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

 

 

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

Изменено пользователем bingo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но, в случае изменений структуры массива требуется корректировка и union

Т.е в двух местах!

Возможна путаница

Когда не хочется "в двух местах", на помощь приходит X macro. Почитайте на досуге.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.

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

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

o_44a99044.jpg

 

 

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

Лучшее, что здесь подсказали.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

#define ITEM_1 0
#define ITEM_2 1
#define ITEM_3 2


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

 

Это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или я чего-то не понял в вопросе или я в таких случаях использую offsetof()

Правда при этом придётся у структур именованные поля выдумать (хоть бы и фиктивные), но, думаю это более функционально и переносимо, нежели вручную расставлять метки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...