-
- __INTADDR__, очевидно, нарочно сделана так, чтобы не вызывать
предупреждения. Просто вычисляет смещение, и всё, дрступа нет. А
для вашего макроса, мало ли, вдруг вы реально обращаетесь - ловите
предупреждение. - Nikolay_Po(26.04.2023 13:02)
- чудеса какие-то... пишу __INTADDR__ ручками все равно варнинг. Этот __INTADDR__ применяется только в макросе offsetof IBAH(1 знак., 26.04.2023 13:41, ссылка)
- А зачем там pack? Я так и не понял. - SciFi(26.04.2023 12:53)
- Чтоб структура занимала 32+8+8=48 бит, а не 32+16+16=64 или даже
32*3=96 бит (если чип 32-бит), когда её сохраняют в байтовую
EEPROM. - Nikolay_Po(26.04.2023 12:59)
- Ну, во-первых, пока EEPROM не кончился, утаптывать эту структуру -
пустая трата времени. - SciFi(26.04.2023 13:41)
- Может быть критично время, требуемое для записи, например, при
пропаже питания. Ещё, я всегда делаю выравнивание износа. Меньше
данных - меньше износ, могу чаще писать за время жизни изделия без
риска отказа памяти. - Nikolay_Po(26.04.2023 13:44)
- Сова на глобусе, так вижу. - SciFi(26.04.2023 13:48)
- Лучше ты свое занудство на работу напряги(с) Почему __INTADDR__ то
работает то не работает? IBAH(24 знак., 26.04.2023 13:54)
- Возьми смещения членов штатно, с помощью offsetof(). И сравни
разности между соседними смещениями с sizeof(члена), а сумму
offsetof(члена) и sizeof(типа) последнего члена структуры с
размером структуры. Если совпало - значит упаковано верно. Правда,
как закатать это в макрос препроцессора - я ХЗ. - Nikolay_Po(26.04.2023 14:01)
- Я уже победил, вот так отлично работает #define PROVERKA(var)
typedef struct {int var##TmpVar : !((offsetof(IntEEPROM_t,
var))%sizeof((((IntEEPROM_t*)0)->var)));} TmpVar##var;. Просто
непонятки с __INTADDR__, хочу все знать - IBAH(26.04.2023 14:04)
- Спасибо. Интересно. Как я понял, проверяется выравнивание положения каждого члена структуры (или вообще, любой переменной) по размеру её типа. Верно? Макрос, правда, получился для конкретного типа струткуры, IntEEPROM_t. Можно сделать универсальный, для любых типов структур? Nikolay_Po(305 знак., 28.04.2023 09:44)
- Я уже победил, вот так отлично работает #define PROVERKA(var)
typedef struct {int var##TmpVar : !((offsetof(IntEEPROM_t,
var))%sizeof((((IntEEPROM_t*)0)->var)));} TmpVar##var;. Просто
непонятки с __INTADDR__, хочу все знать - IBAH(26.04.2023 14:04)
- Возьми смещения членов штатно, с помощью offsetof(). И сравни
разности между соседними смещениями с sizeof(члена), а сумму
offsetof(члена) и sizeof(типа) последнего члена структуры с
размером структуры. Если совпало - значит упаковано верно. Правда,
как закатать это в макрос препроцессора - я ХЗ. - Nikolay_Po(26.04.2023 14:01)
- Уж так повелось, максималист я. - Nikolay_Po(26.04.2023 13:49)
- Лучше ты свое занудство на работу напряги(с) Почему __INTADDR__ то
работает то не работает? IBAH(24 знак., 26.04.2023 13:54)
- Сова на глобусе, так вижу. - SciFi(26.04.2023 13:48)
- Может быть критично время, требуемое для записи, например, при
пропаже питания. Ещё, я всегда делаю выравнивание износа. Меньше
данных - меньше износ, могу чаще писать за время жизни изделия без
риска отказа памяти. - Nikolay_Po(26.04.2023 13:44)
- Ну, во-первых, пока EEPROM не кончился, утаптывать эту структуру -
пустая трата времени. - SciFi(26.04.2023 13:41)
- в данном случае незачем. Я эту структуру заполняю на ходу, понадобилась энергонезависимя переменная дописал - IBAH(26.04.2023 12:57)
- Чтоб структура занимала 32+8+8=48 бит, а не 32+16+16=64 или даже
32*3=96 бит (если чип 32-бит), когда её сохраняют в байтовую
EEPROM. - Nikolay_Po(26.04.2023 12:59)
- __INTADDR__, очевидно, нарочно сделана так, чтобы не вызывать
предупреждения. Просто вычисляет смещение, и всё, дрступа нет. А
для вашего макроса, мало ли, вдруг вы реально обращаетесь - ловите
предупреждение. - Nikolay_Po(26.04.2023 13:02)