'type cast' из DWORD в набор бит - C (СИ)
Формулировка задачи:
например если есть функция принимающая DWORD
... не хотелось-бы каждый раз при вызове добавлять к списку ещё и приведение, типа
func((XPARAM) (CONSTANT1|CONSTANT2|CONSTANT3), ....)
работает например так, с копированием параметра
если просто в функции создать
typedef struct _xparam { unsigned item: 16; unsigned color: 4; unsigned bg: 4; unsigned charset: 2; unsigned is_x: 1; unsigned WSLE: 1; unsigned GLE: 1; unsigned nofocus: 1; unsigned tab: 2; } XPARAM; void x_func(DWORD flag, ...) { union _RP { DWORD dw; XPARAM p; } RP; RP.dw = flag; //... if (RP.p.is_x) is_x_handler(); ... }
XPARAM var = (XPARAM) dwFlags;
тоerror C2440: 'type cast' : cannot convert from 'DWORD' to 'XPARAM'
// хотя тоже не уверен что не копируется, но упрощаются эти RP.p.is_x как-то ещё можно упростить это func((XPARAM) (CONSTANT1|CONSTANT2|CONSTANT3), ....) ? просто этих CONSTANT1... и так может быть штук 5 и с некороткими именамиРешение задачи: «'type cast' из DWORD в набор бит»
textual
Листинг программы
#define NUM1_M(x) (x & 0xF) #define NUM2_M(x) ((x>>4) & 0xF) void RE_mesg(DWORD flag) { WORD prs =(flag>>16); wsprintfA( (LPSTR) &buf ,"\ str=%s\n\ num1=%#.6X\n\ num2=%#.6X\n\ " , Strs[(WORD)flag] , TXTC[NUM1_M(prs)] , BGC[NUM2_M(prs)]); MessageBoxA(0, (LPSTR)&buf, Strs[(WORD)flag],0); }
Объяснение кода листинга программы
- Объявляется функция
RE_mesg
, которая принимает параметрflag
типаDWORD
. - Внутри функции объявляется переменная
prs
типаWORD
, которая получает верхние 2 байта из параметраflag
. - Используется функция
wsprintfA
для форматирования строки, которую затем записывают в буферbuf
. - В строке форматирования используются макросы
NUM1_M
иNUM2_M
, которые выполняютtype cast
изDWORD
в набор бит (в данном случае 4 бита). - В строке форматирования используются константы
Strs
иTXTC
, которые представляют собой строки-заменители для символов и цветов, соответственно. - В строке форматирования используются константы
BGC
, которые представляют собой наборы битов, используемых для определения цвета фона. - Вызывается функция
MessageBoxA
для отображения сообщения с использованием буфераbuf
. - Сообщение отображается с использованием параметра
flag
, который содержит набор флагов, определяющих тип сообщения. - Функция возвращает
BOOL
значениеTRUE
, указывающее на успешное выполнение, илиFALSE
, если произошла ошибка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д