VL (26.11.2014 07:44, просмотров: 1) ответил fk0123 на Геттер возвращает конкретный тип. Точно так же как элемент битовой структуры имел бы тип. В чём разница? Типы не должны позволять присвоения как попало. Без C++ задумка, понятно, бессмысленная. Так же и сеттер ожидает аргументом только конкретный
Я заметил - когда одни люди говорят - п...ц, другие не верят. три структуры
typedef struct _DateSpecialYear {
unsigned day : 5;
unsigned mon : 4;
unsigned year : 6;
unsigned prog : 5;
} tDateSpecialYear;
typedef struct _DateSpecial {
unsigned day : 5;
unsigned mon : 4;
unsigned prog : 5;
} tDateSpecial;
typedef struct _DateSeason {
unsigned day : 5;
unsigned mon : 4;
unsigned group : 1;
} tDateSeason;
Структура обычная, внизу задифайнены смещения полей.
typedef struct _C{
int16 GoEvent_Table[NUM_GO_EVENT];
int32 PriceTarif[NUM_TARIF + 1];
int16 LimLowActiv;
int8 TLowActiv;
int8 LimE_PERC;
int8 FL_CheckModeLimE;
int8 FL_TarifMode;
int8 tauInterv;
int8 LevelLNErr;
int8 sum_diff;
int8 tauPInt;
int8 LimP_PERC;
int8 ModeLimP;
int8 LimP_CheckTarif;
int8 LimU_HIST;
int8 LimFreq;
int8 LimTemp;
int16 LimUmax;
int16 LimUmin;
} tCFG_METER;
#pragma pack()
// смещения полей
#define SHIFT_CFG_METER_GOEVENTTABLE 0
#define SHIFT_CFG_METER_PRICETARIF SHIFT_CFG_METER_GOEVENTTABLE + 2*NUM_GO_EVENT
#define SHIFT_CFG_METER_LIMLOWACTIV SHIFT_CFG_METER_PRICETARIF+(4*(NUM_TARIF+1))
#define SHIFT_CFG_METER_TLOWACTIV SHIFT_CFG_METER_LIMLOWACTIV+2
#define SHIFT_CFG_METER_LIMEPERC SHIFT_CFG_METER_TLOWACTIV+1
#define SHIFT_CFG_METER_FL_CHECKMODELIME SHIFT_CFG_METER_LIMEPERC+1
#define SHIFT_CFG_METER_FL_TARIFMODE SHIFT_CFG_METER_FL_CHECKMODELIME+1
#define SHIFT_CFG_METER_TAUINTERV SHIFT_CFG_METER_FL_TARIFMODE +1
#define SHIFT_CFG_METER_LEVELLNERR SHIFT_CFG_METER_TAUINTERV+1
#define SHIFT_CFG_METER_SUMDIFF SHIFT_CFG_METER_LEVELLNERR+1
#define SHIFT_CFG_METER_TAUPINT SHIFT_CFG_METER_SUMDIFF+1
#define SHIFT_CFG_METER_LIMPPERC SHIFT_CFG_METER_TAUPINT+1
#define SHIFT_CFG_METER_MODELIMP SHIFT_CFG_METER_LIMPPERC+1
#define SHIFT_CFG_METER_LIMPCHECKTARIF SHIFT_CFG_METER_MODELIMP+1
#define SHIFT_CFG_METER_LIMUHIST SHIFT_CFG_METER_LIMPCHECKTARIF+1
#define SHIFT_CFG_METER_LIMFREQ SHIFT_CFG_METER_LIMUHIST+1
#define SHIFT_CFG_METER_LIMTEMP SHIFT_CFG_METER_LIMFREQ+1
#define SHIFT_CFG_METER_LIMUMAX SHIFT_CFG_METER_LIMTEMP+1
#define SHIFT_CFG_METER_LIMUMIN SHIFT_CFG_METER_LIMUMAX+2
Пример расчет адреса
a = adr_sh + EEADR_LIMP_CHECK_POW + (subCmd - SMP_OPT_POW_LIM_EVENING_01_CODE) * SIZE_LIMP_CHECK_POW * 2 + SIZE_LIMP_CHECK_POW; // адрес
На всем этом фоне
#define EEADR_STATE_RE 0x6A10
#define SIZE_STATE_RE 16
#define EEADR_STATE_SIGN_INTERF 0x6A20
#define SIZE_STATE_SIGN_INTERF 40