Записки программиста Программирование и не только

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,		""}
}; 
Метки записи: Нет комментариев