Re: pole bitového pole v C

Miroslav Šinko sinkomiro na gmail.com
Sobota Leden 12 23:31:54 CET 2013


Mierne sa stracam v tom, co presne chcete robit. Union poskytuje rozny
pristup k tej istej oblasti pamati. Vas pripad by som asi riesil takto
(ale vravim, neviem, ci chapem zadanie):
union ostane, az na char -> unsigned char
typedef union {
    unsigned char value;
    struct {
              unsigned CisloBitu : 6;
              unsigned SetClr : 1;
   } bits;
} _SetBitPole;

ale funkcii by som dal ako vstupny parameter char, opat unsigned
void VentilSet (unsigned char CisloVentilu);
 tmp bude typu union:
_SetBitPole tmp;

teraz si nastavim polozky, kedze mate CisloSekce a hodnotu, tak:
tmp.bits.CisloBitu=(24 - CisloSekce);
tmp.bits.SetClr=1;

funkcii predam value (vyuzivam ten rozny pristup k rovnakej pamati):
VentilSet(tmp.value);

Neviem, co vo funkcii potrebujete robit, ak potrebujete opat
pristupovat bitovo, tak Vas prototyp void VentilSet (_SetBitPole
CisloVentilu) bol OK, volanie jednoducho
VentilSet(tmp);
Len potom nechapem vyznam unionu, staci bitove pole:
typedef struct {
              unsigned CisloBitu : 6;
              unsigned SetClr : 1;
} _bits;
Premenna tmp, aj vstupny parameter do funkcie typu _bits.

Ak chcete zapis formou  (24 - CisloSekce) | 0x40; tak je zase zbytocne
bitove pole a stacia vam vsetky typy char, lepsie unsigned char.

Pretypovavacie zapisy budu fungovat, ale vobec nerozumiem preco by ste
ich pouzivat, kedze pri nich vobec nevyuzivate vyhody unionu.

miro


2013/1/12 Miroslav Draxal <evik na volny.cz>:
> Vlastně obklikou to dělám takhle
>
>                                   tmp.value = (24 - CisloSekce) | 0x40;
>
>                                   VentilSet (tmp);
>
>
>
> Chtěl bych
>
>     VentilSet ((24 - CisloSekce) | 0x40);
>
>
>
> From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On
> Behalf Of Jaroslav Buchta
> Sent: Saturday, January 12, 2013 9:44 PM
>
>
> To: HW-news
> Subject: Re: pole bitového pole v C
>
>
>
> Ja proste na tyhle prevody jdu pres ukazatele, takze bych to udelal zase
> takhle (nezkouseno)
>
> VentilSet (*((_SetBitPole*)&TMP));
>
> Proste se vezme adresa promenne TMP operatorem &, ukazatel na cokoli  jde
> pretypovat na ukazatel na cokoli jineho, cili i na union a pak se operatorem
> dereference * zase ziska objekt na odkazovane adrese (uz pretypovany). Mozna
> to jde i jednoduseji, ale ja takhle prevadim i typy z neznaminkovych na
> znamenkove, napr. v komunikacnich paketech, kdyz UINT uvnitr obsahuje
> hodnotu se znamenkem, napr.: float fTempSecIn =
> (float)*(short*)&ProcImgRO.r.tempSecInp100;
>
>
> Dne 12.1.2013 21:34, Miroslav Draxal napsal(a):
>
> Hmm, přiznávám, že tomu nehovím, neumím to přečíst. Nic. Ráno se k tomu
> vrátím, a budu se to snažit pochopit. Pro dnešek ještě jednu věc.
>
>
>
> Mějme podprogram
>
> void VentilSet (_SetBitPole CisloVentilu)
>
>
>
> kde
>
> typedef union {
>
>     char value;
>
>
>
>     struct {
>
>                unsigned CisloBitu : 6;
>
>                unsigned SetClr : 1;
>
>     } bits;
>
> } _SetBitPole;
>
>
>
> Pokud budu mí char TMP
>
> Jak to dostanu do volání toho podprogramu.
>
>
>
> VentilSet(TMP)
>
>
>
> Stále se jedná o 1byt.
>
> Je mi jasné že na začátku vytvořit TMP jako _ SetBitPole
>
> Přetypování char na union nejde. Jak na to? Míra
>
>
>


Další informace o konferenci Hw-list