<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>