Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 30 + hiring
Avatar
Berger
Člen
Avatar
Berger:11.1.2021 10:38

Potřebuji pracovat s daty, které lze popsat takto

typedef struct
{
uint8_t      jas;
unit32_t    RGBW;
} RGBWLED

přičemž do zařízení se pak posílá pouze 32bitu RGBW.
Nicméně pro některé operace by bylo vyhodnějí, aby se s daty pracovalo jako s

typedef struct
{
uint8_t    jas;
uint8_t    R;
uint8_t    G;
uint8_t    B;
uint8_t    W;
} RGBWLED

Otázka tedy zní zda lze s jednou 32bit proměnou pracovat jako s unit32_t a současně jako se čtyřma unit8_t ?

Děkuji

Zkusil jsem: NA

Chci docílit: Snažím se doshnout toho abych sou4asn2 mohl použít

RGBWLED[0].RGBW=FF00FF­00;
RGBWLED[0].R=FF;
a vysledk byl
FFFFFF00

 
Odpovědět
11.1.2021 10:38
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Berger
Petr Štechmüller:11.1.2021 11:57

Ahoj, řešení tvého problému spočívá v použití union.

typedef struct {
uint8_t      jas;
unit32_t    RGBW;
} RGBWLED_simple

typedef struct {
uint8_t    jas;
uint8_t    R;
uint8_t    G;
uint8_t    B;
uint8_t    W;
} RGBWLED_extended

union RGBWLED {
    RGBWLED_simple simple;
    RGBWLED_extended extended;
}

Pak můžeš připstupovat k jednotlivým položkám skoro tak, jak popisuješ:

RGBWLED theSructure;

theStructure.simple.jas = 20;
theStructure.simple.RGBW = 20;

theStructure.extended.jas = 20;
theStructure.extended.R = 3;
theStructure.extended.G = 5;
theStructure.extended.B = 9;
theStructure.extended.W = 13;

operátor sizeof union bude vracet velikost největší položky, kterou union dokáže reprezentovat.

Nahoru Odpovědět
11.1.2021 11:57
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Patrik Valkovič
Člen IT Redactor Gang
Avatar
Odpovídá na Petr Štechmüller
Patrik Valkovič:11.1.2021 12:09

Jen upozorním, že by se nemělo současně používat dva přístupy.

theStructure.simple.jas = 20;
theStructure.extended.R = 3;
theStructure.extended.G = 5;
theStructure.extended.B = 9;
theStructure.extended.W = 13;

S trochou práce by se to asi dalo (musí se pohlídat zarovnání a offsety jednotlivých properties), ale obecně se to nedoporučuje.

Nahoru Odpovědět
11.1.2021 12:09
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Patrik Valkovič
Petr Štechmüller:11.1.2021 12:13

Souhlasím. Na použití union jsem narazil, když jsem pročítal zdrojáky knihovny SDL, konkrétně event subsystem:
https://github.com/…SDL_events.h#L464

Takže člověk musí vědět co dělá ;-)

Nahoru Odpovědět
11.1.2021 12:13
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Berger
DarkCoder:11.1.2021 15:08

Union se používá tam kde je třeba data interpretovat dvěma nebo více různými způsoby.

RGBW je sám o sobě složen z jednotlivých složek, které lze přečíst a měnit přímo pomocí ukazatele.

Př.
mějme hodnotu RGBW = 1000(dec) = (00000000 00000000 00000011 11101000) (bin)¨
jednotlivé složky (čteno zleva) mají hodnoty 0, 0, 3, 232.

#include <stdio.h>
#include <stdint.h>

enum eRGBW {W,B,G,R};

int main(void) {
        uint32_t var = 1000;
        void* p = &var;

        printf("%d\n", *((uint8_t*)(p) + R));
        printf("%d\n", *((uint8_t*)(p) + G));
        printf("%d\n", *((uint8_t*)(p) + B));
        printf("%d\n", *((uint8_t*)(p) + W));

        return 0;
}

Výstup programu:

0
0
3
232
Nahoru Odpovědět
11.1.2021 15:08
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.