<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<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">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>
</body>
</html>