<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">Naprost souhlasím. A jsem na tom stejně. Já
        třeba dělal v Delphi server řídících jednotek, kde běží asi 300
        vláken (nestejných). Moc si nedovedu představit, že bych to
        uchodil bez "úpornosti" kompilátoru Pascalu.</font><br>
    </p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 5.9.2023 v 15:29 ajtservis
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:1284e211-2237-695c-2683-f3765206d73a@ajtservis.cz">jsem
      "ne_ceckar", a znam jen asembler pro x51 a pozdeji deplphi/pascal.
      <br>
      cecko je podle me evolucne prvni nadstavba nad asemblerem a pak uz
      se to vezlo ? :-).
      <br>
      t.
      <br>
      <br>
      Dne 05.09.2023 v 15:24 Martin Záruba napsal(a):
      <br>
      <blockquote type="cite">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.
        <br>
        <br>
        Uznávám, že zápis je velmi úsporný. Například
        <br>
        <br>
        i++;
        <br>
        <br>
        nenapíšete asi v žádném jiném jazyku úsporněji. Na druhou
        stranu.... Použili jste někdy někdo zápis
        <br>
        <br>
        if (A=B) {};
        <br>
        <br>
        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.
        <br>
        <br>
        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>
        <br>
        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.
        <br>
        <br>
        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>
        <br>
        Martin Záruba
        <br>
        <br>
        Dne 5.9.2023 v 10:51 Pavel Hudeček napsal(a):
        <br>
        <blockquote type="cite">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">www.HW.cz</a>
          <br>
          <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
          <br>
          <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
          <br>
        </blockquote>
        <br>
        _______________________________________________
        <br>
        HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
        <br>
        <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
        <br>
        <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
        <br>
        <br>
      </blockquote>
      <br>
    </blockquote>
  </body>
</html>