22Янв/130
Для чего нужен union
Продолжаю открывать для себя С++...
Объединение служит для, как бы это ни казалось странным, объединения.
Это позволяет, записывая данные в одно поле union
'а, одновременно получать эти же данные в другом поле. Причем поля могут быть разные по содержимому.
Пример:
typedef struct { unsigned short fbNVRIncorrectCRC :1; unsigned short fbConfigIncorrectCRC :1; unsigned short fbSPIInterfaceError :1; unsigned short fbMFIncorrectCRC :1; unsigned short fbMFWriteError :1; unsigned short fbMFNotInstalled :1; unsigned short fbEEJFatalError :1; unsigned short fbUnused1 :1; unsigned short fbNotInitialized :1; unsigned short fbNonFiscalMode :1; unsigned short fbShiftOpened :1; unsigned short fb24HourOverflow :1; unsigned short fbEEJArchieveClosed :1; unsigned short fbEEJNotActivated :1; unsigned short fbMFNoMemoryForShift :1; unsigned short fbMFWrongPassword :1; unsigned char dbDocumentType; } ST_FRSTATUS; typedef union { ST_FRSTATUS stStatus; unsigned char dbStatus[3]; } UN_FRSTATUS;
И теперь можно записать данные в массив unsigned char dbStatus[3];
и потом получить их из структуры уже разобранными.
Т.е. можно обратиться к dbStatus[2] и к stStatus.dbDocumentType и получить один и тот же результат.
Единственное - нельзя обращаться по разным именам в одном блоке программы..
21Янв/130
Вынести определение массива структур в другой файл
В продолжении к красоте
Объявляем (declaration)
//st.h enum { /* I/O ERRORS */ ERR_INVALID_STATUS = 0x01, ERR_INVALID_FUNCTION = 0x02 }; struct fr_errs_struct { int err; const char * const msg; }; extern struct fr_errs_struct fr_errs [];
Определяем (definition)
//st.cpp #include <st.h> struct fr_errs_struct fr_errs [] = { {ERR_INVALID_STATUS, "Функция невыполнима при данном статусе"}, {ERR_INVALID_FUNCTION, "В команде указан неверный номер функции"}, {0, ""} };
Ну и функция для использования всего этого
const char* getText(int aErr) { int i = 0; while(fr_errs[i].err && fr_errs[i].err != aErr) { i++; } return fr_errs[i].msg; }
18Янв/130
…
Красота:
enum { /* I/O ERRORS */ ERR_INVALID_STATUS = 0x01, ERR_INVALID_FUNCTION = 0x02 }; struct { int err; const char * const msg; } fr_errs [] = { {ERR_INVALID_STATUS, "Функция невыполнима при данном статусе"}, {ERR_INVALID_FUNCTION, "В команде указан неверный номер функции"} {0, ""} };