21
Июл
2021

Проверить любую структуру на изменение полей

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

Имеется следующая структура (... означает, что подобных полей в ней может быть много)

typedef struct S_STR1
{
/*! Внутренняя структура */
struct
{
    float dVal       ; /*!< Значение */
...
    struct
    {
        uint8_t vVal  : 1; /*!< Достоверность */
...
    } valid;
} state;
} __attribute__((packed)) S_STR1;

Объявлена глобальная переменная-структура, которую мы хотим проверять на изменение:

S_STR1 data = {};

Функция для проверки изменений внутри структуры использует статическую структуру такого же типа:

uint8_t _check_changes( void)
{
uint8_t _res = 0;
static S_STR1 temp_data = {};

if ( data.dVal != temp_data.dVal || 
     data.valid.vVal != temp_data.valid.vVal)
{
   _res = 1;
}

temp_data.dVal = data.dVal; 
temp_data.valid.vVal = data.valid.vVal;

return _res; 
}

Какой механизм можно придумать, чтобы не проверять каждое поле структуры на изменение "напрямую", как это сделано сейчас? В проекте нужно проверять множество различных структур подобного вида, писать подобные функции проверки очень не хочется, т. к. дублирование кода. Есть желание универсализировать этот момент. Возможно ли такое?

Источник: https://ru.stackoverflow.com/questions/1307600/%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C-%D0%BB%D1%8E%D0%B1%D1%83%D1%8E-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83-%D0%BD%D0%B0-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B9

Тебе может это понравится...

Добавить комментарий