ceckovy kviz

Pablo na xpablo.cz Pablo na xpablo.cz
Středa Září 6 08:36:41 CEST 2023


DD,

taky pridam svoji trosku do mlyna. Proste je treba zmenit pouzivane IDE. 
Nekdo Vam tady doporucoval PIO, ale to IDE neni - dovolte mi podat 
vysvetleni :-)

Arduino uz historicky je implementace jazyka Wiring, nebudu tady psat, co 
wiring je - to je dostatecne popsane na internetu, ale zamerim se na to, jak
vnitrne ArduinoIDE funguje. Kicovou komponentou je (byla) cast, nazyvana 
ArduinoBuilder. Nejdrive byla integralni soucasti IDE, pak jako externi 
komponenta a nakonec se prevtelila do soucasneho arduino-cli. Je to vlastne 
kod, ktery umozni prelozit Arduino "projekt" z prikazove radky. Vnitrne 
funguje zhruba tak, ze pospojuje vsechny dodane .ino soubory (v pripade 
multi-ino projektu) do docasneho .cpp, udela dopredne deklarace vsech 
funkci, ktere najde a prelozi to pomoci odpovidajiciho prekladace. Tuto 
funkcionalitu nahrazuje to doporucovane PIO - jde o soubor nastroju, napsany
v Pythonu, ktery umozni preklad projektu v ruznych frameworcich (Arduino, 
CubeMX, ...) pro ruzne platformy, nazyvane core (AVR, ESP, STM, ...), ale 
nic vic. Na to, abyste mel plnohodnotne prostredi s funkcionalitou, kterou 
pozadujete potrebujete neco vic - myslim, ze nejznamejsi IDE s podporou PIO 
jsou Atom, Visual Studio Code, Clion (urcite jich bude vic). Myslim, ze 
nejdale je integrovana podpora PIO do VSC. VSC je taky zdarma a da se do nej
snadno doplnit cppcheck jako linter (staticka kontrola kodu). Udajne lze 
doinstalovat i clang-tidy, ale to jsem nezkousel. Clion je placeny produkt s
integrovanou podporou PIO, ktera ale zatim neni tak dokonala, jako ve VSC. 
Zato ale Clion obsahuje clang-tidy uz out-of-the-box. Co si vzpominam, tak 
PIO integrace ve VSC seriovy monitor automaticky vypinala pri uploadu a 
dokonce mela moznost upload-monitor, kdy kod nahrala a hned spustila 
monitor.

-- 
Pavel Brychta
http://www.xpablo.cz

---------- Původní e-mail ----------
Od: Martin Záruba <swz na volny.cz>
Komu: hw-list na list.hw.cz
Datum: 5. 9. 2023 17:48:29
Předmět: Re: ceckovy kviz
" 
Dík za názory, mnohé jsou zajímavé a pro mě určitě podnětné. 


Protože pro to Arduino musím něco (ne úplně jednoduchého) usmolit, existuje 
nějaká možnost:

1) Donutit ArduinoIde, aby hlásil ty překlepy s chybějícím rovnítkem v if a 
asi i mnohé další

2) Použít něco lepšího pro Arduino

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


Martin Záruba

Dne 5.9.2023 v 16:48 Pavel Hudeček napsal(a):

" No asi tak nějak:-)
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.

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.

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ší.

PH


Dne 05.09.2023 v 16:06 Jindroush napsal(a):

" 
Dobry den,

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)





Jinak samozrejme zapis 
if( A=B ) {} je zcela legalni a kazdy zdravy kompilator s obvykle 
'rozumnymi' (nikoli nutne vychozimi) nastavenimi (-Wall) vypise neco jako 
toto:


<source>:7:10: warning: suggest parentheses around assignment used as truth 
value [-Wparentheses]
    7 |     if( a=b )
      |         ~^~





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. 

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.





J.





On 05.09.2023 15:24, Martin Záruba wrote:

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

Uznávám, že zápis je velmi úsporný. Například 


i++; 


nenapíšete asi v žádném jiném jazyku úsporněji. Na druhou stranu.... Použili
jste někdy někdo zápis 


if (A=B) {};

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.

Nebo třeba to, že typ char obsahuje znaménko a tudíž porovnání nefunguje. 
Nebo že v řetězci nesmí být 0x00.


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.

Nechci vyvolat flame, ale co je na C tak úžasné? (Fakt mě to pouze zajímá, 
protože na to nemohu přijít)


Martin Záruba

Dne 5.9.2023 v 10:51 Pavel Hudeček napsal(a):

"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:-) 
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.


PH 

Dne 05.09.2023 v 8:46 Jan Waclawek napsal(a): 
"Je pravda, ze to makro je v tomto pripade nerozumne, a ta funkcia je 
rozumnejsie riesenie. 

(Na druhej strane, ta posadnutost pravovernych C++-karov tym const... 
zhodou okolnosti v tomto konkretnom programe ten retazec konstruujem...) 

Ale neviem, ako by mi to malo dojst. Aj som to skusil, gcc s -Wall a 
-Wpedantic nic nevyhlasil. A ani nema dovod. Ale ano, zakryje to problem. 

Ano, cely problem je v tom, ze strlen() ma navratovy typ unsigned 
(spominany size_t), a -strlen() je teda uplne rovnako unsigned (dost dlho 
som hladal v C99 kde to presne je, ze vysledok vyrazu ma ten isty typ ako 
su konvertovane typy operandov, lebo to nie je v kapitole Expressions kde 
by som to cakal, ale v kapitole 6.3.1.8 Usual arithmetic conversions). 
Inaksie povedane, ak je retazec dlhy povedzme 3, tak -strlen je u 
32-bitoveho mcu 0xFFFFFFFD. 

Cize v makre to ((xx) < 0) je vzdy false a optimalizator to true vetvu 
vyhodi. 

Funkcia to zachrani tym, ze pri volani sa ta unsigned value skonvertuje na 
signed. To je sice, prisne vzate, implementation defined, ale u twos 
complement (co je defacto standard a od C23 bude povinne) to dopadne dobre 
:-). 

A teraz, co je lepsie? Mat zhodou okolnosti funkcny program nad ktorym by 
ma ani nenapadlo sa zamysliet; alebo sa na nefunkcnom programe naucit, ze 
size_t je unsigned a miesanie unsigned so signed zvykne dopadnut zle, 
takze sa tomu treba vyhybat? 

wek 


----- Original Message --------------- 

To je jednoduché - vy pravověrní C-čkaři pouľíváte makra i tam, kde se 
to vůbec nehodí. Kdybyste pouľívali raději statické inline funkce jako 
static inline void LcdBXPrint (int xx, int yy, const char * s) { 
    LcdBPrint( (((xx) < 0) ? LCD_XMAX : 0) + (xx) * FONT_XSIZE, (yy) * 
FONT_YSIZE, s); 
} 
pak vám dojde, ľe argument xx nemůľe být unsigned (resp. size_t), pokud 
má vyhodnocen jako záporný a problém zázračně zmizí. 

Mrazík 

On 03. 09. 23 23:00, Jan Waclawek wrote: 
"Mam funkciu 

    void LcdBPrint(uint32_t x, uint32_t y, char * s); 

ktora vypise retazec na LCD s rozmermi LCD_XMAX, LCD_YMAX na poziciu x, y 
pixelov od laveho horneho rohu. 

Vypisuje to neproporcionalnym fontom s rozmermi znaku FONT_XSIZE, 
FONT_YSIZE. 

Z nejakych dovodov chcem vypisovat retazce zarovnane jeden za druhym; ale 
niekedy chcem vypisovat retazce pod seba zarovnane na pravy okraj. To prve 
vedie na volania typu: 

    LcdBPrint(doteraz_napocitane_znaky_od_laveho_okraja * FONT_XSIZE, riadok

* FONT_YSIZE , retazec); 

a to druhe na 

    LcdBPrint(LCD_XMAX - strlen(retazec) * FONT_XSIZE, riadok * FONT_YSIZE, 
retazec); 
   Vravim si, takto je to dost neprehladne, a pritom sa tam to nasobenie 
furt 
opakuje. A tiez, tie dve veci su navzajom dostatocne podobne. Tak co keby 
ze si napisem makro, do ktoreho bud zadam kladne x, co znamena pocet 
znakov od laveho okraja, alebo zaporne x, co znamena pocet znakov od 
praveho okraja: 

    #define LcdBXPrint(xx, yy, s) LcdBPrint( (((xx) < 0) ? LCD_XMAX : 0) + 
(xx) * FONT_XSIZE, (yy) * FONT_YSIZE, s) 

Ked pisem zlava, tak mam 

    LcdBXPrint(doteraz_napocitane_znaky_od_laveho_okraja, riadok, retazec); 

co je pekne, prehladne, a funguje. Ale ked pisem zlava, tak 

    LcdBXPrint(-sizeof(retazec), riadok, retazec); 

nefunguje. 

Preco? 
" " " " " 



_______________________________________________
HW-list mailing list  -  sponsored by <a href='http://www.hw.cz' class='-wm-moz-txt-link-abbreviated'>www.HW.cz</a>
<a href='mailto:Hw-list na list.hw.cz' class='-wm-moz-txt-link-abbreviated'>Hw-list na list.hw.cz</a>
<a href='http://list.hw.cz/mailman/listinfo/hw-list' class='-wm-moz-txt-link-freetext'>http://list.hw.cz/mailman/listinfo/hw-list</a>

" _______________________________________________ 
HW-list mailing list - sponsored by www.HW.cz 
Hw-list na list.hw.cz 
http://list.hw.cz/mailman/listinfo/hw-list 
"
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230906/d9187330/attachment.htm>


Další informace o konferenci Hw-list