TOG 0 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба Друзья, есть глобальная структура с кучей переменных. Указатель на эту структуру скармливается функции-обработчику обрабатывающей сию структуру по своему алгоритму. Но теперь функций стало 10, а потом их станет 100, и алгоритм работы у всех функций будет разный. И переменные в структуре для новых функций имеют совсем разный смысл. Мне бы хотелось как-то использовать один участок памяти для структуры, но как-то называть переменные в ней нормальными понятными именами соответствующими выбранной функции-обработчику. Подскажите как это сделать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба 1) union 2) через #define 3) свое описание структуры для каждой ф-ии, но выделяьт память только на одну, и далее по указателю на эту память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 20 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба Это - плохая практика. Если структуры имеют разный смысл полей, то это - разные структуры. Через union можно совместить разные структуры и массивы в одной области памяти, но тогда придется вручную следить за тем, что именно сейчас записано в этой области. Компромиссное решение - переменные типа VARIANT, используемые во многих операционных системах для обмена информацией между программами. Там в заголовке есть отдельное поле, которое содержит код типа записанной информации (целое число, плавающая запятая, строка и т.п.). Тогда вместе с union получается относительно надежный обмен информацией: получившая функция должна удостовериться, что пришли именно нужные ей данные и она знает, как их разбирать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 18 июля, 2022 Опубликовано 18 июля, 2022 (изменено) · Жалоба On 7/18/2022 at 10:10 AM, Allregia said: 1) union 2) через #define 3) свое описание структуры для каждой ф-ии Возможно подойдет вариант 3. Сделаю свое описание структуры для каждой ф-и. 1. typedef struct { int16_t quart; int16_t X ... еще много всякого } DSP_DATAtype1 2. typedef struct { int8_t Temp; int8_t Bat ... еще много всякого } DSP_DATAtype2 Сейчас память выделяется статически во время компиляции: DSP_DATAtype1 DspData1; А как сделать это ? (Мне бы хотелось во время работы как-то переключать описания структуры) On 7/18/2022 at 10:10 AM, Allregia said: но выделять память только на одну, и далее по указателю на эту память. Изменено 18 июля, 2022 пользователем TOG Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба В 18.07.2022 в 15:10, Allregia сказал: 3) свое описание структуры для каждой ф-ии, но выделяьт память только на одну, и далее по указателю на эту память Есть такое дело, к примеру, в api цифровых приемопередатчиков от SiLabs Si446x: встроенный процессор имеет ограниченные ресурсы, ответные данные для каждой функции помещаются в один и тот же union. Следует следить, чтобы эти данные центральный процессор забирал себе после каждого вызова любой из функций, иначе данные перетираются следующей функцией. В принципе особого напряга это не доставляет... Все исходники генерируются фирменным софтом WDS3 для общения с этими ИС, можно скачать-ознакомиться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба typedef struct { int16_t quart; int16_t X //... еще много всякого } DSP_DATAtype1; typedef struct { int8_t Temp; int8_t Bat //... еще много всякого } DSP_DATAtype2; typedef union { DSP_DATAtype1 Data1; DSP_DATAtype2 Data2; } DSP_DATAtype; //Usage: DSP_DATAtype *Data; Data->Data1.quart = 0; Data->Data2.Temp = 1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба Отлично Allregia, Intel4004, V_G, novokovfb Union это то что надо ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба On 7/18/2022 at 8:06 AM, TOG said: Подскажите как это сделать ? Такое обычно делается через указатели на РАЗНЫЕ структуры со своими полями. union тоже подойдет, но он хорош в рамках ОДНОЙ структуры с близким по смыслу назначением. Если назначение и название структур планируется абсолютно разным, то через указатели. зы. Для подобных целей отлично подойдет дин. память, но ее применение требует аккуратности и контроля со стороны программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба В 18.07.2022 в 08:06, TOG сказал: Подскажите как это сделать ? 1. union 2. оверлей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба Можно и union, но не обязательно. Только память надо объявить на максимальный размер всех структур. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 20 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба On 7/18/2022 at 1:19 PM, x893 said: Можно и union, но не обязательно. Только память надо объявить на максимальный размер всех структур. при создании union компилятор зам определит максимальный размер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 18 июля, 2022 Опубликовано 18 июля, 2022 · Жалоба On 7/18/2022 at 12:24 PM, novikovfb said: при создании union компилятор зам определит максимальный размер Эт точно. Плюс есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться