2015-03-19 3 views
1

Я недавно пришел по этому коду, и я не могу обойти его. Может кто-нибудь, пожалуйста, объяснить мне, что там происходит?Не совсем понимаю эту часть кода

union Color32 
{ 
    struct ARGB 
    { 
     uint8_t b; 
     uint8_t g; 
     uint8_t r; 
     uint8_t a; 
    } parts; 
    uint32_t argb; 
    Color32() : argb(0) {} 
    Color32(uint32_t c_argb) : argb(c_argb) {} 
    Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b) 
    { 
     parts.a=a; 
     parts.r=r; 
     parts.g=g; 
     parts.b=b; 
    } 
}; 
+1

Что вы можете сделать до сих пор? –

+4

От конструкторов в 'union', я думаю, это может быть C++, а не C. – wolfPack88

+2

Материал для чтения: http://stackoverflow.com/questions/346536/difference-between-a-structure-and-a-union- in-c, http://en.wikipedia.org/wiki/Union_type#C.2FC.2B.2B. –

ответ

4

Члены union общего хранилища. Это контрастирует с struct, где каждому члену выделяется отдельное хранилище.

Эффект этого кода является то, что члены b, g, r & a хранилища акций ARGB структуры с другим членом argb из Color32union.

Таким образом, конструктор, который устанавливает значение argb неявно устанавливает значения b, g, r & a как упорядоченные части битовой комбинации из argb.

Наоборот b, g, r & a конструктор создает значение argb.

Диаграмма в разделе «ARGB» здесь действительно хорошая картина того, как эти части «упакованы» в 32-битный блок.

http://en.wikipedia.org/wiki/RGBA_color_space

я, наверное, не нужно объяснять, что b стенды для голубого, зеленого g, r для красного и a для альфа (AKA прозрачность)!

Вы можете столкнуться с трудностями, если есть потребность в переносимости по принципу «большой»/«маленький».

0

ARGB - это структура из 4 uints, которая представляет собой зеленый, синий, красный и для я не знаю. Структура создается с указанием частей названия, поэтому, когда вам нужно ее использовать, вы должны действовать следующим образом: parts.r = 20 или parts.g = 50.

Затем он создает цвет объекта, который может содержать 4 параметра argb (4 * 8 = 32).

И инициализируется цвет объекта 32 с 4 параметрами, которые вы даете ему: а, б, в, г

Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b) 
    { 
    parts.a=a; 
    parts.r=r; 
    parts.g=g; 
    parts.b=b; 
    } 

Чтобы возобновить, у вас есть объект с именем цвета 32 бита, который содержит 4 объекта из 8 бит от частей конструкции.

Смежные вопросы