<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <div class="moz-cite-prefix">Dobry den,</div>
    <div class="moz-cite-prefix">vychazite odjinud a ohybate si to ke
      svym lety nabytym navykum. Kazdy, kdo programuje v C, vase vytky
      nebude prakticky chapat, protoze nic z toho neni 'zvykem' delat
      tak, jak delate. Tj. kazdy C programator by mel vedet, jake typy
      kdy pouzit a to, jak vypada C retezec. Tj. na ukladani osmibitove
      hodnoty neupouziju char, ale bud 'moderni C99' uint8_t ze
      stdint.h, nebo si provedu typedef unsigned char byte, nebo v
      nejhorsim budu porad pouzivat unsigned char (s riziky
      neprenositelnosti)<br>
    </div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">Jinak samozrejme zapis <br>
      if( A=B ) {} je zcela legalni a kazdy zdravy kompilator s obvykle
      'rozumnymi' (nikoli nutne vychozimi) nastavenimi (-Wall) vypise
      neco jako toto:<br>
    </div>
    <div class="moz-cite-prefix"><source>:7:10: warning: suggest
      parentheses around assignment used as truth value [-Wparentheses]<br>
          7 |     if( a=b )<br>
            |         ~^~<br>
    </div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">Na C je uzasne to, ze je vsude,
      existuje pro nej mraky kodu, knihoven, kompilatoru, dalsich
      naradi. Tomuhle se nejspis zadny jiny jazyk nemuze rovnat. <br>
      <br>
      Ja u Pascalu vzdy trpel a nikdy jsem nechapal jeho lokalni
      popularitu, vzdy jsem vnimal jen sama omezeni a uzvanenost a zadne
      prinosy v porovnani s C.<br>
    </div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">J.<br>
    </div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">On 05.09.2023 15:24, Martin Záruba
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:3135ca3a-90cb-4e7a-d5a7-3e7e6735c1f7@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p><font face="Arial">Když vidím, s čím tu všichni bojujete, tak
          mám pocit, že jsem dělal dobře, že jsem se bránil jazyku C v
          jakékoli podobě. Nakonec mě stejně dostihl v podobě nutnosti
          udělat program pro Arduino.</font></p>
      <p><font face="Arial">Uznávám, že zápis je velmi úsporný.
          Například <br>
        </font></p>
      <p><font face="Arial">i++; <br>
        </font></p>
      <p><font face="Arial">nenapíšete asi v žádném jiném jazyku
          úsporněji. Na druhou stranu.... Použili jste někdy někdo zápis
          <br>
        </font></p>
      <p><font face="Arial">if (A=B) {};</font></p>
      <p><font face="Arial">a přitom je syntakticky správně. Kompilátor
          pochopitelně nic nehlásí a já nemohl pochopit, proč program
          nefunguje. Holt zvyk z Pascalu, že tak je to dobře.</font></p>
      <p><font face="Arial">Nebo třeba to, že typ char obsahuje znaménko
          a tudíž porovnání nefunguje. Nebo že v řetězci nesmí být 0x00.<br>
        </font></p>
      <p><font face="Arial">V krátkém, jednoduchém programu je asi to,
          že můžete porovnat cokoli s čímkoli (když víte jak) a konverzi
          typů většinou neřešíte, vlastnost, která zkracuje zápis. Ale
          zásadně zvyšuje pravděpodobnost chyby. Já vím, Pascal je
          užvaněný a begin-end asi je opravdu horší, než {}, ale úžasné
          je, že pokud chcete přiřadit k sobě něco, co k sobě nepatří,
          musíte to zcela jasně říct, jinak je to syntaktická chyba.</font></p>
      <p>Nechci vyvolat flame, ale co je na C tak úžasné? (Fakt mě to
        pouze zajímá, protože na to nemohu přijít)<br>
      </p>
      <pre class="moz-signature" cols="72">Martin Záruba</pre>
      <div class="moz-cite-prefix">Dne 5.9.2023 v 10:51 Pavel Hudeček
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:7a11485d-45f5-a235-e27f-374348b33c3f@seznam.cz">Myslím,
        že je lepší mít program funkční proto, že vím co dělám, ale i
        přesto v něm zbytečně nevymejšlet koniny:-) <br>
        Jestli se má zobrazit řádek textu, tak nejspíš stejně bude
        potřeba, aby někdo měl čas si ho přečíst, takže není důvod
        šetřit nějaké nanosekundy. Tzn. dal bych tam normální funkci. A
        ať si s ní optimizér pak udělá co chce. <br>
        <br>
        PH <br>
        <br>
        Dne 05.09.2023 v 8:46 Jan Waclawek napsal(a): <br>
        <blockquote type="cite">Je pravda, ze to makro je v tomto
          pripade nerozumne, a ta funkcia je <br>
          rozumnejsie riesenie. <br>
          <br>
          (Na druhej strane, ta posadnutost pravovernych C++-karov tym
          const... <br>
          zhodou okolnosti v tomto konkretnom programe ten retazec
          konstruujem...) <br>
          <br>
          Ale neviem, ako by mi to malo dojst. Aj som to skusil, gcc s
          -Wall a <br>
          -Wpedantic nic nevyhlasil. A ani nema dovod. Ale ano, zakryje
          to problem. <br>
          <br>
          Ano, cely problem je v tom, ze strlen() ma navratovy typ
          unsigned <br>
          (spominany size_t), a -strlen() je teda uplne rovnako unsigned
          (dost dlho <br>
          som hladal v C99 kde to presne je, ze vysledok vyrazu ma ten
          isty typ ako <br>
          su konvertovane typy operandov, lebo to nie je v kapitole
          Expressions kde <br>
          by som to cakal, ale v kapitole 6.3.1.8 Usual arithmetic
          conversions). <br>
          Inaksie povedane, ak je retazec dlhy povedzme 3, tak -strlen
          je u <br>
          32-bitoveho mcu 0xFFFFFFFD. <br>
          <br>
          Cize v makre to ((xx) < 0) je vzdy false a optimalizator to
          true vetvu <br>
          vyhodi. <br>
          <br>
          Funkcia to zachrani tym, ze pri volani sa ta unsigned value
          skonvertuje na <br>
          signed. To je sice, prisne vzate, implementation defined, ale
          u twos <br>
          complement (co je defacto standard a od C23 bude povinne) to
          dopadne dobre <br>
          :-). <br>
          <br>
          A teraz, co je lepsie? Mat zhodou okolnosti funkcny program
          nad ktorym by <br>
          ma ani nenapadlo sa zamysliet; alebo sa na nefunkcnom programe
          naucit, ze <br>
          size_t je unsigned a miesanie unsigned so signed zvykne
          dopadnut zle, <br>
          takze sa tomu treba vyhybat? <br>
          <br>
          wek <br>
          <br>
          <br>
          ----- Original Message --------------- <br>
          <br>
          To je jednoduché - vy pravověrní C-čkaři pouľíváte makra i
          tam, kde se <br>
          to vůbec nehodí. Kdybyste pouľívali raději statické inline
          funkce jako <br>
          static inline void LcdBXPrint (int xx, int yy, const char * s)
          { <br>
              LcdBPrint( (((xx) < 0) ? LCD_XMAX : 0) + (xx) *
          FONT_XSIZE, (yy) * <br>
          FONT_YSIZE, s); <br>
          } <br>
          pak vám dojde, ľe argument xx nemůľe být unsigned (resp.
          size_t), pokud <br>
          má vyhodnocen jako záporný a problém zázračně zmizí. <br>
          <br>
          Mrazík <br>
          <br>
          On 03. 09. 23 23:00, Jan Waclawek wrote: <br>
          <blockquote type="cite">Mam funkciu <br>
            <br>
                void LcdBPrint(uint32_t x, uint32_t y, char * s); <br>
            <br>
            ktora vypise retazec na LCD s rozmermi LCD_XMAX, LCD_YMAX na
            poziciu x, y <br>
            pixelov od laveho horneho rohu. <br>
            <br>
            Vypisuje to neproporcionalnym fontom s rozmermi znaku
            FONT_XSIZE, <br>
            FONT_YSIZE. <br>
            <br>
            Z nejakych dovodov chcem vypisovat retazce zarovnane jeden
            za druhym; ale <br>
            niekedy chcem vypisovat retazce pod seba zarovnane na pravy
            okraj. To prve <br>
            vedie na volania typu: <br>
            <br>
                LcdBPrint(doteraz_napocitane_znaky_od_laveho_okraja *
            FONT_XSIZE, riadok <br>
            * FONT_YSIZE , retazec); <br>
            <br>
            a to druhe na <br>
            <br>
                LcdBPrint(LCD_XMAX - strlen(retazec) * FONT_XSIZE,
            riadok * FONT_YSIZE, <br>
            retazec); <br>
               Vravim si, takto je to dost neprehladne, a pritom sa tam
            to nasobenie furt <br>
            opakuje. A tiez, tie dve veci su navzajom dostatocne
            podobne. Tak co keby <br>
            ze si napisem makro, do ktoreho bud zadam kladne x, co
            znamena pocet <br>
            znakov od laveho okraja, alebo zaporne x, co znamena pocet
            znakov od <br>
            praveho okraja: <br>
            <br>
                #define LcdBXPrint(xx, yy, s) LcdBPrint( (((xx) < 0)
            ? LCD_XMAX : 0) + <br>
            (xx) * FONT_XSIZE, (yy) * FONT_YSIZE, s) <br>
            <br>
            Ked pisem zlava, tak mam <br>
            <br>
                LcdBXPrint(doteraz_napocitane_znaky_od_laveho_okraja,
            riadok, retazec); <br>
            <br>
            co je pekne, prehladne, a funguje. Ale ked pisem zlava, tak
            <br>
            <br>
                LcdBXPrint(-sizeof(retazec), riadok, retazec); <br>
            <br>
            nefunguje. <br>
            <br>
            Preco? <br>
          </blockquote>
        </blockquote>
        _______________________________________________ <br>
        HW-list mailing list  -  sponsored by <a
          class="moz-txt-link-abbreviated" href="http://www.HW.cz"
          moz-do-not-send="true">www.HW.cz</a> <br>
        <a class="moz-txt-link-abbreviated moz-txt-link-freetext"
          href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
        <br>
        <a class="moz-txt-link-freetext"
          href="http://list.hw.cz/mailman/listinfo/hw-list"
          moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
        <br>
      </blockquote>
      <br>
      <fieldset class="moz-mime-attachment-header"></fieldset>
      <pre class="moz-quote-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>
    <p><br>
    </p>
    <pre class="moz-signature" cols="72">-- 
Jindroush <a class="moz-txt-link-rfc2396E" href="mailto:jindroush@seznam.cz"><jindroush@seznam.cz></a></pre>
  </body>
</html>