'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);
}

Объяснение кода листинга программы

  1. Объявляется функция RE_mesg, которая принимает параметр flag типа DWORD.
  2. Внутри функции объявляется переменная prs типа WORD, которая получает верхние 2 байта из параметра flag.
  3. Используется функция wsprintfA для форматирования строки, которую затем записывают в буфер buf.
  4. В строке форматирования используются макросы NUM1_M и NUM2_M, которые выполняют type cast из DWORD в набор бит (в данном случае 4 бита).
  5. В строке форматирования используются константы Strs и TXTC, которые представляют собой строки-заменители для символов и цветов, соответственно.
  6. В строке форматирования используются константы BGC, которые представляют собой наборы битов, используемых для определения цвета фона.
  7. Вызывается функция MessageBoxA для отображения сообщения с использованием буфера buf.
  8. Сообщение отображается с использованием параметра flag, который содержит набор флагов, определяющих тип сообщения.
  9. Функция возвращает BOOL значение TRUE, указывающее на успешное выполнение, или FALSE, если произошла ошибка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5