<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p><font face="Arial">Dík za názory, mnohé jsou zajímavé a pro mě
určitě podnětné. <br>
</font></p>
<p><font face="Arial">Protože pro to Arduino musím něco (ne úplně
jednoduchého) usmolit, existuje nějaká možnost:</font></p>
<p><font face="Arial">1) Donutit ArduinoIde, aby hlásil ty překlepy
s chybějícím rovnítkem v if a asi i mnohé další</font></p>
<p>2) Použít něco lepšího pro Arduino</p>
<p>Mě třeba pije krev, že pokud mám zapnutý monitor na seriovém
portu arduina a chci nahrát nový program, musím ho vypnout,
nahrát, zapnout. Nechápu, že povel pro download ho přechodně
nevypíná.<br>
</p>
<pre class="moz-signature" cols="72">Martin Záruba</pre>
<div class="moz-cite-prefix">Dne 5.9.2023 v 16:48 Pavel Hudeček
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:f10a95f5-2074-37d1-df96-6ce087ee8fbb@seznam.cz">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
No asi tak nějak:-)<br>
Jazyky jsou prostě více či méně odlišné a proto je potřeba více či
méně odlišně uvažovat při jejich používání. A zrovna Pascal vs C
jsou na té škále odlišnosti tak daleko, že lidé musí mít jiné
psychologické vlastnosti, aby v nich byli ochotni dobrovolně psát.<br>
<br>
Další věc je, že prasit se dá v každém jazyku. C a z něj odvozené
jazyky jsou na vastní syntaxi úsporné, což zas dává víc prostoru
na délky názvů a komentáře, které narozdíl od syntaxe jazyka
programátor ovlivní. A to má pak velký vliv na čitelnost později.<br>
<br>
Ale s tím if = je zajímavé, že jsem věděl, že to vede k warningu,
ale nenapadlo mě, že to bude "suggest parentheses", warning který
často vypínám, protože jinak otravuje při banálních kombinacích
and/or, které mi bez závorek přijdou přehlednější. Já mám prostě
závorky = pozor je to složitější.<br>
<br>
PH<br>
<br>
<div class="moz-cite-prefix">Dne 05.09.2023 v 16:06 Jindroush
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:41c46bd9-a82b-c2aa-8590-5f094f7aca87@seznam.cz">
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<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>
</blockquote>
</blockquote>
</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>
</body>
</html>