bingo 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 (изменено) · Жалоба Добрый день, коллеги Столкнулся со следующей проблемой Необходима синтаксическая конструкция в Си для адресации некоторых элементов массива по метке (позиция известна при компиляции), а не по индексу. В массиве хоть и хранятся структуры, но описывается он как массив uint8!! Массив и структуры в нем определяются API откомпилированной библиотеки, поэтому сильно изменять (чтобы появились у структур именованные поля) не могу! Сейчас приходится часто менять этот большой массив, поэтому приходится вручную пересчитывать номер позиции в массиве, куда будут в дальнейшем будут писаться байты. Заранее спасибо за ответы! Изменено 19 апреля, 2017 пользователем bingo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Описать объединение (union), состоящее из массива uint8 и из структуры. Других возможностей совместить одно с другим на этапе компиляции нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба 1. Индексы требуемых ячеек надо определить через enum и пользоваться именованными константами. 2. Объявить структуру (или массив структур), объявить union этой структуры и Вашего массива, присвоить указателю на этот union адрес этого массива, пользоваться именованными полями структуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Спасибо за ответы! Такой подход с union обсуждался. Но, в случае изменений структуры массива требуется корректировка и union Т.е в двух местах! Возможна путаница Что касается enum, то не совсем понимаю как это применить у меня, т.к. индексы хоть известны при компиляции, но они же изменятся при коррекции структуры массива. И надо будет вносить изменения в enum.. Это не лучше чем простой индекс.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 19 апреля, 2017 Опубликовано 19 апреля, 2017 (изменено) · Жалоба Массив и структуры в нем определяются API откомпилированной библиотеки, поэтому сильно изменять (чтобы появились у структур именованные поля) не могу! и "Такой подход с union обсуждался. Но, в случае изменений структуры массива требуется корректировка и union Т.е в двух местах!" Дак меняется тип структуры или нет? Вы определитесь сначала с исходными требованиями для задачи.. Изменено 19 апреля, 2017 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bingo 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 (изменено) · Жалоба Дык и обращайтесь к элементу структуры, зачем высасывать проблему из пальца? Ответ прост. Я выше писал. Вызов библиотечной функции подразумевает параметр в виде массива байт uint8. Но сами содержимое этого массива (определяется спецификацией пакета) - это несколько структур данных, которые я сейчас при отладке не редко переставляю/изменяю. Соответственно меняется цифровой индекс нужных мне байт и приходится вручную пересчитывать новое положение элемента массива. В прототипе функции - это только массив байт без объявления структур с именованными полями! Изменено 19 апреля, 2017 пользователем bingo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Но, в случае изменений структуры массива требуется корректировка и union Т.е в двух местах! Возможна путаница Когда не хочется "в двух местах", на помощь приходит X macro. Почитайте на досуге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Вызов библиотечной функции подразумевает параметр в виде массива байт uint8.Сделайте функцию-обертку, которая принимает указатель на структуру, приводит его к указателю на байты и вызывает библиотечную функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Вызов библиотечной функции подразумевает параметр в виде массива байт uint8. Но сами содержимое этого массива (определяется спецификацией пакета) - это несколько структур данных, которые я сейчас при отладке не редко переставляю/изменяю. Соответственно меняется цифровой индекс нужных мне байт и приходится вручную пересчитывать новое положение элемента массива. Сделайте функцию-обертку, которая принимает указатель на структуру, приводит его к указателю на байты и вызывает библиотечную функцию. Лучшее, что здесь подсказали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Сейчас приходится часто менять этот большой массив, поэтому приходится вручную пересчитывать номер позиции в массиве, куда будут в дальнейшем будут писаться байты. #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 0 19 апреля, 2017 Опубликовано 19 апреля, 2017 · Жалоба Или я чего-то не понял в вопросе или я в таких случаях использую offsetof() Правда при этом придётся у структур именованные поля выдумать (хоть бы и фиктивные), но, думаю это более функционально и переносимо, нежели вручную расставлять метки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться