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

Можно ли в программе как-то переименовать переменные во время работы ?

Друзья,

есть глобальная структура с кучей переменных. Указатель на эту структуру скармливается функции-обработчику обрабатывающей сию структуру по своему алгоритму.

Но теперь функций стало 10, а потом их станет 100, и алгоритм работы у всех функций будет разный. И переменные в структуре для новых функций имеют совсем разный смысл.

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

Подскажите как это сделать ? 

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


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

1) union

2) через #define

3) свое описание структуры для каждой ф-ии, но выделяьт память только на одну, и далее по указателю на эту память.

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


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

Это - плохая практика. Если структуры имеют разный смысл полей, то это - разные структуры.

Через union можно совместить разные структуры и массивы в одной области памяти, но тогда придется вручную следить за тем, что именно сейчас записано в этой области. Компромиссное решение - переменные типа VARIANT, используемые во многих операционных системах для обмена информацией между программами. Там в заголовке есть отдельное поле, которое содержит код типа записанной информации (целое число, плавающая запятая, строка и т.п.). Тогда вместе с union получается относительно надежный обмен информацией: получившая функция должна удостовериться, что пришли именно нужные ей данные и она знает, как их разбирать.

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


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

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:

но выделять память только на одну, и далее по указателю на эту память.

 

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

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


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

В 18.07.2022 в 15:10, Allregia сказал:

3) свое описание структуры для каждой ф-ии, но выделяьт память только на одну, и далее по указателю на эту память

Есть такое дело, к примеру, в api цифровых приемопередатчиков от SiLabs Si446x: встроенный процессор имеет ограниченные ресурсы, ответные данные для каждой функции помещаются в один и тот же union. Следует следить, чтобы эти данные центральный процессор забирал себе после каждого вызова любой из функций, иначе данные перетираются следующей функцией. В принципе особого напряга это не доставляет...

 

Все исходники генерируются фирменным софтом WDS3 для общения с этими ИС, можно скачать-ознакомиться...

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


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

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;

 

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


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

On 7/18/2022 at 8:06 AM, TOG said:

Подскажите как это сделать ? 

Такое обычно делается через указатели на РАЗНЫЕ структуры со своими полями.

union тоже подойдет, но он хорош в рамках ОДНОЙ структуры с близким по смыслу назначением.

Если назначение и название структур планируется абсолютно разным, то через указатели.

зы. Для подобных целей отлично подойдет дин. память, но ее применение требует аккуратности и контроля со стороны программы.

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


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

Можно и union, но не обязательно.

Только память надо объявить на максимальный размер всех структур.

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


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

On 7/18/2022 at 1:19 PM, x893 said:

Можно и union, но не обязательно.

Только память надо объявить на максимальный размер всех структур.

при создании union компилятор зам определит максимальный размер

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


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

On 7/18/2022 at 12:24 PM, novikovfb said:

при создании union компилятор зам определит максимальный размер

Эт точно. Плюс есть.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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