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, ""}
};