*****SPAM***** RE: C _ jak rozepsat řádek

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Duben 27 18:53:21 CEST 2013


Nevim jak s bitovymi poli ale union pro pristyp BYTE, WORD, DWORD... se 
vidi celkem bezne, da se to osetrit ruznumi makry ALIGN.... xxxENDIAN... 
aby to bylo univerzalne prenositelne a je to OK. Zas takovy bordel v 
ruznych implementacich neni a funguje to celkem stabilne (bitova pole by 
se taky mela postupne umistovat do standardniho typu (int) od LSB ve 
vsech implementacich, ne? )

Dne 27. 4. 2013 18:48, Miroslav Draxal napsal(a):
> Re: C _ jak rozepsat řádek
>
> Díky, tohle funguje,
>
> Na štábní kultuře zapracuji, v tomto projektu již nechám sprasenou.
>
> S těmi ukazateli mam vždy problém, že nějak neumím najít systém, odkud 
> ten řádek mám začít číst. I za 10 let v tom budu plavat.
>
> *From:*hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] 
> *On Behalf Of *Josef Štengl
> *Sent:* Saturday, April 27, 2013 2:26 PM
> *To:* HW-news
> *Subject:* Re: C _ jak rozepsat řádek
>
> On v nich trošku plave skoro každý :-)
>
> To jak máte napsáno "// tohle je OK", tak to je v pořádku protože
> pracujete s ukazatelem na strukturu, kterou derefenrecujete a
> přistupujete k ní jako ke struktuře resp. přímo k položce struktury. Ten
> typ položky je důležitý, protože položky nazvané Bit[0-7] jsou položky
> bitového pole, a položka bitového pole nemá adresu, takže na něj nelze
> vytvořit ukazatel. Viz pozn. 106 dokumentu n1256: (C99 draft)
>
> The unary & (address-of) operator cannot be applied to a bit-field
> object; thus, there are no pointers to or arrays of bit-field objects.
>
> Takže se pak přes ukazatel snažíte získat adresu položky pole, která je
> ovšem položka bitového pole a ten nemá adresu a skončí to chybou.
>
> Dále jen poznámky pod čarou. Pokud vás rozčílí, tak si jich nevšímejte:
>
> Název unionu začíná podtržítkem, což má jazyk C rezervovaný pro budoucí
> použití. Podtržítka na začátku čehokoliv v aplikačních programech
> nepoužívat!
>
> Zvážil bych použití bitového pole ve stylu
>
> http://c-faq.com/misc/bitsets.html
>
> Jen k tomu mám poznámku, že char by měl být unsigned char, protože by se
> neměly provádět bitové operace na znaménkových typech. Ve velmi
> speciálních případech dostáváme zajímavě nesprávné výsledky.
>
> Vypadá to, že se snažíte mít různý přístup k jednomu místu v paměti s
> využitím typu union. To je z hlediska specifikace C chybně, protože jak
> se ukládají data v položce union je jen a pouze záležitost překladače a
> jinde by to nemuselo fungovat správně (dobrá, to že jsem se s tím ještě
> nesetkal, neznamená že se to prohlásí za standard. Aby to pak nedopadlo
> jak s tím raketoplánem co vybouchl :-)
>
> Pro mě je to příklad toho jak by se to psát nemělo. Jestli mi do toho
> nic není, tak si toho nevšímejte :-D.
>
> Hmm než jsem to dopsal, tak toto od pana Augustýna by mohlo fungovat.
>
> (*pProgEEpr).EndProgram = 1;
>
> Protože se nejprve provede dereference ukazatele na strukturu a pak se
> přistupuje k položce.
>
> Hezký den.
>
>
> Dne 27.4.2013 12:18, Miroslav Draxal napsal(a):
> > Dobrý den
> >
> > Mějme
> >
> > char MenuPolozkaSet;
> >
> > typedef union {
> >
> >      char value;
> >
> >      struct {
> >
> >                 unsigned Bit0 : 1;
> >
> >                 unsigned Bit1 : 1;
> >
> >                 unsigned Bit2 : 1;
> >
> >                 unsigned Bit3 : 1;
> >
> >                 unsigned Bit4 : 1;
> >
> >                 unsigned Bit5 : 1;
> >
> >                 unsigned Bit6 : 1;
> >
> >                 unsigned Bit7 : 1;
> >
> >      } Bits;
> >
> >      struct {
> >
> >                 unsigned val : 7;
> >
> >                 unsigned bit_ : 1;
> >
> >      } ProlnutiPauza;
> >
> >      struct {
> >
> >                 unsigned Mesic : 5;
> >
> >                 unsigned AutoOnOff : 1;
> >
> >                 unsigned EndProgram : 1;
> >
> >      };
> >
> > } _ProgramEEprom;
> >
> > (*((_ProgramEEprom*) & MenuPolozkaSet)).EndProgram = 1; // tohle je OK
> >
> > Pokud bych to chtěl rozepsat přes fyzický ukazatel
> >
> > _ProgramEEprom *pProgEEpr = (_ProgramEEprom*) &MenuPolozkaSet;
> >
> > *pProgEEpr.EndProgram = 1;
> >
> > To hází chybu
> >
> > MenuKey.c:261: error: struct/union required
> >
> > MenuKey.c:261: error: illegal conversion between types
> >
> > Což asi chápu, ale jak to napsat. Snažím se tomu přijít na kloub. V těch
> > pointerech plavu.
> >
> >
> >
> > __________ Informace od ESET NOD32 Antivirus, verze databaze 8272
> > (20130426) __________
> >
> > Tuto zpravu proveril ESET NOD32 Antivirus.
> >
> > http://www.eset.cz
> >
> >
> > _______________________________________________
> > HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
> > Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
> > http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
> Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 8272 
> (20130426) __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 8272 
> (20130426) __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130427/3eb66469/attachment.htm>


Další informace o konferenci Hw-list