<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><title>Re: přístup na byty v int 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]--></head><body lang=CS link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Dobrý den,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> Tak konkrétně, vynechme načítání z&nbsp;eeprom, a dejme tomu, že do int potřebuji zapsat 0xAA a 0xBB aby výsledek byl 0xAABB. Jde o PIC, hitech kompiler. V&nbsp;asm jsou to 4 řádky, hitech si stím moc neporadí. Chci mu napovědět. Ale nějak nenapadá jak. <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</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"'> hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] <b>On Behalf Of </b>Josef Štengl<br><b>Sent:</b> Tuesday, October 29, 2013 8:35 AM<br><b>To:</b> HW-news<br><b>Subject:</b> Re: přístup na byty v int C<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span style='font-size:10.0pt'>Souhlasím, jen doplním.<br><br>Pokud převádíte číslo z jedné velikosti typu do jiné a to oběma směry včetně prohazování bytů (pro ten samý typ) zapomeňte<br>na na ukazatele a použijte bitové posuny:<br>&nbsp; · ukazatele jsou závislé na endianitě (litte endian je sice dominantní leč ne jediný používaný)<br>&nbsp; · přistupování ke stejné oblasti paměti pomocí ukazatelů na rozdílné velikosti je poněkud ošemetná věc, a je od C99<br>poněkud zpřísněna (viz&nbsp; strict aliasing rule), see níže.<br>&nbsp; · kompilátory většinou tyto konstrukce rozpoznávají a překládají optimalizovaně. Je pak docela deprimující, že se píšete<br>se čtyřmi delšími řádkami a vypadne z toho jedna instrukce :-)<br><br>Na union také pozapomeňte, protože u něj není zaručeno nic, kromě vnějšího chování (viz norma). Když už je vhodné ho<br>nasadit, tak se nasazuje se znalostí implementace daného kompilátoru. Další možný problém je při přístupu k proměnným<br>zarovnaným na hranici typu, ale to jsem nikdy neměl potřebu ověřovat.<br><br>A máte to vyřešeno :-).<br><br>Na ukazatele to chce vhodnější příklad.<br><br>ced<br><br><br><br><br>==================================================================<br><br>Zpřísněná pravidla pro přistupování k datům různými typy (pro C99 z C90)<br><br>– more precise aliasing rules via effective type<br><br>Info: Tuto problematiku lze vyhledat pod heslem strict aliasing rule.<br><br>Strict aliasing7) znamená, že kompilátor předpokládá, že dva objekty různého typu neodkazují na stejnou oblast paměti. Při<br>nedodržení tohoto pravidla mohou po překladu vzniknout obtížně odhalitelné chyby8).<br><br>Důvodem zavedení tohoto pravidla je aby autoři kompilátoru mohly bezpečně předpokládat, že změna jedné proměnné se<br>neprojeví změnou jiné. A naopak, kdy mají předpokládat, že proměnné mohou ukazovat na stejnou oblast paměti.<br><br>Například:<br><br>typedef struct<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint16_t a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t b;<br>} sa_t;<br><br>typedef struct<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint16_t a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t b;<br>} sb_t;<br><br>sa_t *a;<br>sb_t *b;<br><br>V tomto případě kompilátor předpokládá, že *a a *b neodkazují na stejnou oblast paměti ačkoliv formát struktur je shodný.<br><br>sa_t *c, *d;<br><br>int16_t i;<br>int16_t *p = &amp;i;<br><br>Kompilátor předpokládá, že *c a *d resp i a *p mohou respektive odkazují na stejnou oblast paměti a nebude používat<br>příslušné optimalizace.<br><br>Nebo.<br><br>int16_t i;<br>void fce(int16_t *j, int16_t *k);<br><br>fce(&amp;i, &amp;i);<br><br>Pokud je funkce fce() volána tímto stylem (stejné typy parametrů, resp hodnota parametru), tak se předpokládá, žej a k<br>ukazují na stejnou oblast paměti.<br><br>Převedení a dereference neshodných ukazatelů obvykle znamená porušení tohoto pravidla. Striktní aliasing je předpokládán C<br>kompilátorem, kterýžto předpokládá, že dereference ukazatelů na objekty rozdílného typu nebudou odkazovat na shodnou<br>oblast paměti9)<br><br>Pravidla pro aliasing určují okolnosti za kterých objekt může mít alias10) jsou definovány v kapitole 6.5 bod 7 standardu C99.<br>Možné vytváření aliasů<br><br>Vytváření aliasů je možné jen pro objekt k němuž je přistupováno pouze výrazem odkazujícím do oblasti paměti (lvalue) v<br>těchto případech.<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Efektivní typ nebo kvalifikovaná verze typu je shodná nebo kompatibilní s efektivním typem objektu.<br><br>Prakticky to znamená, že typy jsou kompatibilní pokud nejsou rozdílné datové typy, modifikátory mohou být různé.<br><br>uint32_t var;<br>uint32_t* const&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = &amp;var;<br>uint32_t* volatile&nbsp;&nbsp;&nbsp; b = &amp;var;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; Typ celých nebo přirozených čísel kompatibilní s typem (efektivní nebo s kvalifikovanou verzí) objektu.<br><br>int32_t*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c = (int32_t*)&amp;var;<br>int32_t* const&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = (int32_t*)&amp;var;<br>int32_t* volatile&nbsp;&nbsp;&nbsp;&nbsp; e = (int32_t*)&amp;var;<br>const int32_t* const&nbsp; f = (int32_t*)&amp;var;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; Jednotlivé členy agregovaného typu (stuct) a typu union splňující předchozí podmínky (včetně vnořených členů).<br><br>struct s<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32_t j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32_t i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union u<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>};<br><br>double *f = &amp;s.u.d;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp; typ char Datové typy char*, signed char*, nebo unsigned char* mohou ukazovat kamkoliv na platnou adresu paměti bez<br>omezení.<br><br>uint64_t long;<br>int8_t* malej = (int8_t *)&amp;long;<br><br><br><br><br>Dne 29.10.2013 01:17, Radek Benedikt napsal(a):<br>&gt; Miroslav Draxal píše v Po 28. 10. 2013 v 23:10 +0100:<br>&gt;&gt; Samozřejmě, tudy cesta vede. Mě vrtá spíš jak to udělat přes ukazatele.<br>&gt;&gt; Určitě to nějak jde. Abych se něco naučil. Míra<br>&gt;<br>&gt;&gt;&gt; Ještě jsem zapomněl přidat jak to dělám do teď. Ale moc se mi to<br>&gt;&gt;&gt; nelíbí.**<br>&gt;&gt;&gt; **<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok = eeprom_read<br>&gt;&gt;&gt; (EEpromLinearKorekce);****<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok &lt;&lt;= 8;****<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linear.Krok |= eeprom_read<br>&gt;&gt;&gt; (EEpromLinearKorekce+1);****<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; ** **<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Jak přistoupit přes ukazatele na int Linear.krok (byt1 ; byt2)?****<br>&gt;<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slo by pretypovat pointer na Linear.krok na typ pointer na byte,<br>&gt; protoze inkrement ukazatele je o delku typu, nikoliv o byte. Nicmene je<br>&gt; to trochu drbani levou rukou za pravym uchem.<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ukazatele bych nechal na pokoji a napsal bych to nacteni na jeden<br>&gt; radek, misto na tri.Usnadni se tim kompilatoru prace s optimalizaci.<br>&gt; Tohle je zrovna dost bezna konstrukce a kompilatory ji obvykle umi.<br>&gt; Nesmi v ni byt ale neco co zavisi na poradi cteni te korekce z EEprom.<br>&gt; Pak se ale neda spolehnout ani na to rozepsani na tri<br>&gt; radky.Optimalizatory pri agresivnim nastaveni umi sahnout i do takoveto<br>&gt; konstrukce. Optimalizace pointrove aritmetiky v prekladaci uz obvykle<br>&gt; tak slusna neni, je to spis o rucni optimalizaci. Jenze pri ni se do<br>&gt; toho zacinaji michat strojove zavisle veci a je pak sranda ten zdrojak<br>&gt; portovat jinam. Objevi se napr. problem little/big endian.<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Navic na vyse popsane konstrukci je videt, ze v podstate prirazeni int<br>&gt; do int muze byt zpracovavane na nekolik kroku a neni proto atomicke. Je<br>&gt; to docela sranda pri preruseni, kdyz by se cela ta korekce jednou za cas<br>&gt; doladovala a skocila napr. z&nbsp; 0x3FF na 0x400. To ale jen na okraj.<br>&gt;<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Radek (bendikt2hw.cz)<br>&gt;<br>&gt;<br>&gt; _______________________________________________<br>&gt; HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br>&gt; <a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br>&gt; <a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br>&gt;<br>_______________________________________________<br>HW-list mailing list&nbsp; -&nbsp; sponsored by <a href="http://www.HW.cz">www.HW.cz</a><br><a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a><br><a 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 8978 (20131028) __________<br><br>Tuto zpravu proveril ESET NOD32 Antivirus.<br><br><a 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 8978 (20131028) __________<BR>
<BR>
Tuto zpravu proveril ESET NOD32 Antivirus.<BR>
<BR>
<A HREF="http://www.eset.cz">http://www.eset.cz</A><BR>


 </body></html>