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