pole bitového pole v C

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Leden 12 14:49:38 CET 2013


Ja na tyto ucely pouzivam funkci a tabulku s prevodni funkci (neco ve 
smyslu idx1 -> idx2) Prehledne a snadno modifikovatelne.


Dne 12.1.2013 14:17, Miroslav Draxal napsal(a):
> Re: pole bitového pole v C
>
> No já to vlastně tuši, někde jsem to kdysi četl, možná i tady. Ale 
> raději jsem se zeptal. Nevíte někdo o nějakém vzorovém příkladu jak 
>  to elegantně řesit ?
>
> Nechce se mi dělat
>
> switch (CisloMagnetu.bits.CisloBitu)
>
> {
>
> case 1:
>
> if (CisloMagnetu.bits.SetClr)
>
>     SPIout_bity.bitOut.Mag1 = 1;
>
> else
>
>     SPIout_bity.bitOut.Mag1 = 0;
>
> break;
>
> case 2:
>
> if (CisloMagnetu.bits.SetClr)
>
>     SPIout_bity.bitOut.Mag2 = 1;
>
> else
>
>     SPIout_bity.bitOut.Mag3 = 0;
>
> break;
>
> case 3:
>
> atd
>
> }
>
> je to vlastně pole char[3], chtěl bych napsat něco univerzálního, kde 
> bych zadal ukazatel na počátek pole, jaký bit nastavit např.14.
>
> Nějak mě nenapadá žádný elegantní způsob. Ale zase, někde jsem to 
> někde viděl v asm pro PIC. Míra
>
> *From:*hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] 
> *On Behalf Of *Jan Waclawek
> *Sent:* Saturday, January 12, 2013 12:08 PM
> *To:* HW-news
> *Subject:* Re: pole bitového pole v C
>
> > > SPIout_bity. PoleBitu[2]=1; //nastav 3 bit v 23bitovém poli.
>
> Kratka odpoved je, ze to nejde a musite si najst ine, "manualne" 
> riesenie (napr. pouzivat shifty a masky).
>
> Teraz ta dlha odpoved :-):
>
> > To IMHO nejde.
>
> Ano, to nejde; dovodov je viacero a vsetky su principialne. Jeden je, 
> ze bitove pole ma predpisanu syntax a tam ziadne miesto pre [] nie je; 
> druha je, ze bitove pole nie je "objekt", t.j. nema adresu (neda sa na 
> neho aplikovat operator &); tretia je, ze v C polia neexistuju, a ta 
> syntakticka finta ze identifikator z deklaracie pola sa interpretuje 
> ako smernik (a nasledne pouzitie a[b] sa priamo konvertuje na *(a + b) 
> kvoli predchadzajucej vlastnosti nemoze fungovat.
>
> Mimochodom, toto je uvedene aj priamo v standarde, v C99 v poznamke 
> 106 k 6.7.2.1#8.
>
> > Ani nevim, jestli je normou dane poradi bitu v tech
>
> Nie je, a toto je znova priamo uvedene v 6.7.2.1#10.
> Naviac, podla toho isteho odstavca, sa moze prekladac volne rozhodnut, 
> ci sa bude jednotlive bitove polia snazit pchat jeden za druhy, alebo 
> ich rozhadze kazdy do jedneho byte ci dokonca vacsieho kusu pamate.
>
> > promennych uchar (a spis tusim, ze to je standardne narvane do typu int)
>
> Ako som hore uviedol, prekladac sa moze sam rozhodnut, ako bitove 
> polie ulozi, a to bez ohladu na deklarovany typ. 6.7.2.1 v principe 
> povoluje akykolvek typ. Dokonca jednym z problematickych bodov je aj 
> benevolentnost normy s ohladom na znamienkovost bitoveho pola, ak je 
> predpisanym typom int bez explicitneho signed alebo unsigned - vid 
> napr. "nadherny" priklad 3 v 6.7.7#6...
>
> Bohuzial, aj ked zakladna uloha normy ako takej je dosiahnut jednotne 
> spravanie prekladacov a tym co najvacsiu prenositelnost; postoj 
> normovacej komisie v podstate od zaciatku je ten, ze zmeny v norme 
> maju zachovavat exitujuce spravanie co najvacsieho poctu prekladacov 
> (ktore si vzdy robia nejake vlastne rozsirenia co su vlastne zakladnym 
> podnetom pre rozsirovanie normy), a preto sa castokrat zrodili a stale 
> rodia kompromisy ktore v podstate skodia prenositelnosti...
>
> > Ja uz jsem natolik zdegenerovany, ze pro typ BOOL pouzivam klasicky po
> > windowsovsku: typedef unsigned char BOOL;  ;-)
>
> C99 definuje _Bool ako jeden zo zakladnych typov (mimochodom je to 
> celociselny typ). Dalej standardna hlavicka <stdbool.h> obsahuje makro 
> bool pre tento isty ucel (7.16#2); pokial viem, bool je zakladny typ v 
> C++. Ak len neplanujete prekladat Vas program v buducnosti nejakym 
> obskurnym prekladacom, nevidim prilis dovod preco sa nedrzat tychto 
> standardnych typov.
>
> Zdalo by sa, ze ak existuje typ, ktory je urceny na ulozenie 
> jednobitovej hodnoty, tak prekladace (aspon tie pre 8-bitove mcu/mpu) 
> budu mat tendenciu ich ukladat efektivne do jedneho bitu pamate, 
> Bohuzial, nepoznam prekladac, co by to tak robil; naviac pred par 
> rokmi sme v ramci SDCC diskutovali, ci to je vobec mozne, a zda sa, ze 
> norma tomu - mozno nechtiac, mozno nasledkom implementacie niekolkych 
> nesuvisiacich poziadaviek - defacto brani kombinaciou niekolkych 
> formalnych poziadaviek.
>
> Spomenuty typ sbit pouzivany prekladacmi pre '51 vychadza, tak ako pan 
> kolega Andel povedal, z faktu, ze '51 ma implementovanych 128 bitov 
> bitovo adresovatelnej pamati (to je 16 byte na bytovych adresach 
> 20h-2fh). Na tejto pamati sa dokonca daju robit aj urcite logicke 
> operacie. Premenne typu sbit takto umoznuju vyuzivat tieto instrukcie 
> priamo programom v C. Na druhej strane vsak vsetky instrukcie 
> pracujuce s touto pamatou maju priamu adresaciu, t.j. adresu operandu 
> je nutne poznat v case prekladu. Aj ked nie je nemozne programom toto 
> obist (t.j. z adresy znamej len pocas behu programu vypocitat adresu 
> bytu v ktorom je bit ulozeny a manipulovat tento byte), nema to prilis 
> velky vyznam a bolo by to zbytocne pracne, takze to implementovane 
> pokial viem v ziadnom prekladaci nie je; co okrem ineho znamena, ze na 
> premenne typu sbit nie je mozne pouzit operator & a tym padom ani nie 
> je mozne ich ukladat do pola.
>
> wek
> _______________________________________________
> 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 7886 
> (20130112) __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 7886 
> (20130112) __________
>
> 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/20130112/b3d0f5ca/attachment.htm>


Další informace o konferenci Hw-list