<html>
<head>
<meta content="text/html; charset=ISO-8859-2"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Ja na tyto ucely pouzivam funkci a
tabulku s prevodni funkci (neco ve smyslu idx1 -> idx2)
Prehledne a snadno modifikovatelne.<br>
<br>
<br>
Dne 12.1.2013 14:17, Miroslav Draxal napsal(a):<br>
</div>
<blockquote cite="mid:000c01cdf0c7$2ff361d0$8fda2570$@cz"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-2">
<meta name="Generator" content="Microsoft Word 12 (filtered
medium)">
<title>Re: pole bitového pole v C</title>
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.StylE-mailovZprvy18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">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 ?<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Nechce
se mi dělat<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
switch (CisloMagnetu.bits.CisloBitu)<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
{<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
case 1:<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
if (CisloMagnetu.bits.SetClr)<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
SPIout_bity.bitOut.Mag1 = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
else<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
SPIout_bity.bitOut.Mag1 = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
break;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
case 2:<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
if (CisloMagnetu.bits.SetClr)<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
SPIout_bity.bitOut.Mag2 = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
else<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
SPIout_bity.bitOut.Mag3 = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
break;<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">
case 3:<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">atd<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">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.<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Nějak
mě nenapadá žádný elegantní způsob. Ale zase, někde jsem to
někde viděl v asm pro PIC. Míra <o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span
style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span
style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a class="moz-txt-link-abbreviated" href="mailto:hw-list-bounces@list.hw.cz">hw-list-bounces@list.hw.cz</a>
[<a class="moz-txt-link-freetext" href="mailto:hw-list-bounces@list.hw.cz">mailto:hw-list-bounces@list.hw.cz</a>] <b>On Behalf Of </b>Jan
Waclawek<br>
<b>Sent:</b> Saturday, January 12, 2013 12:08 PM<br>
<b>To:</b> HW-news<br>
<b>Subject:</b> Re: pole bitového pole v C<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p><span style="font-size:10.0pt">> > SPIout_bity.
PoleBitu[2]=1; //nastav 3 bit v 23bitovém poli.<br>
<br>
Kratka odpoved je, ze to nejde a musite si najst ine,
"manualne" riesenie (napr. pouzivat shifty a masky).<br>
<br>
Teraz ta dlha odpoved :-):<br>
<br>
> To IMHO nejde.<br>
<br>
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.<br>
<br>
Mimochodom, toto je uvedene aj priamo v standarde, v C99 v
poznamke 106 k 6.7.2.1#8.<br>
<br>
> Ani nevim, jestli je normou dane poradi bitu v tech<br>
<br>
Nie je, a toto je znova priamo uvedene v 6.7.2.1#10.<br>
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.<br>
<br>
> promennych uchar (a spis tusim, ze to je standardne
narvane do typu int)<br>
<br>
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...<br>
<br>
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...<br>
<br>
> Ja uz jsem natolik zdegenerovany, ze pro typ BOOL
pouzivam klasicky po<br>
> windowsovsku: typedef unsigned char BOOL; ;-)<br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
wek<br>
_______________________________________________<br>
HW-list mailing list - sponsored by <a
moz-do-not-send="true" href="http://www.HW.cz">www.HW.cz</a><br>
<a moz-do-not-send="true" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>
<a moz-do-not-send="true"
href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></span>
<o:p></o:p></p>
<p class="MsoNormal"><br>
<br>
__________ Informace od ESET NOD32 Antivirus, verze databaze
7886 (20130112) __________<br>
<br>
Tuto zpravu proveril ESET NOD32 Antivirus.<br>
<br>
<a moz-do-not-send="true" href="http://www.eset.cz">http://www.eset.cz</a><o:p></o:p></p>
</div>
<br>
<br>
__________ Informace od ESET NOD32 Antivirus, verze databaze 7886
(20130112) __________<br>
<br>
Tuto zpravu proveril ESET NOD32 Antivirus.<br>
<br>
<a moz-do-not-send="true" href="http://www.eset.cz">http://www.eset.cz</a><br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
</blockquote>
<br>
</body>
</html>