ceckovy kviz

František Burian BuFran na seznam.cz
Čtvrtek Září 7 06:50:10 CEST 2023


operator ++ ma side effect, program by nemel obsahovat side effecty uvnitr podminky.

Typicky

if (i++ > max)
   i = 0


pokud je i=max, kompilator MUZE toto prelozit ze po vykonani bude v i max, max+1 i 0, v zavislosti na optimalizacich. (zkuste to prelozit kompilatorem pro 
m68k/ColdFire)
a budete dost prekvapeni (sam jsem si kdysi nabehl) a neni to chyba kompilatoru, je to dobre popsany behavior. Kompilator muze vsechny side effecty uvnitr 
podminky ignorovat.

If muze v bezpecnem programu obsahovat pouze nemodifikujici vyrazy, uz i volani vice funkci je "o drzku" protoze ty se nemusi zavolat. Tedy volani funkci je 
povoleno jen
pokud nemaji side effecty.

S pozdravem,

   Frantisek Burian


Dne 06. 09. 23 v 22:45 Pavel Hudeček napsal(a):
> Já si myslím, že tohle je typický příklad umělé konstrukce, kterou přímo v této podobě nikdo normálně nepoužije. Jenže šedá je teorie a zelený strom života...
>
> Měříme na pár kanálech ADC a jednou to uděláme bez přerušení a podruhé s:
>
> *for (uint8_t mxIdx=AD_chanStart; mxIdx<=AD_chanEnd; mxIdx++)* {
>     ADC0_MUXPOS = mxIdx;
>     ...
>     adData[mxIdx-AD_chanStart] = ADC0_RES;
> }
>
> Normální for, v jednom řádku se dozvíme od, do a po jak velkých krocích.
>
> Jenže normálně nechci měřit for cyklem a v něm čekat až je změřeno, takže chci použít přerušení. Ale v něm chci mít taky takový jeden řádek, kde je jedna 
> konstrukce s od, do a po jakých krocích.
>
> ISR (ADC0_RESRDY_vect) {
>     static uint8_t mxIdx=AD_chanStart;
>
>     adData[mxIdx-AD_chanStart] = ADC0_RES;
> *if (++mxIdx > AD_chanEnd) mxIdx = AD_chanStart;*
>     ...
> }
> Jen je škoda, že ta inicializační hodnota je tam dvakrát. Ale pořád je to lepší, než rozdělený na řádky ++ a if. Proč? Jednak když to vidím, tak je to jako 
> vidět ten for, prostě jasná konstrukce, kde hned vím co dělá a proč. No a hlavně se při nějaké úpravě nemůže snadno stát, že se z toho omylem kus odsune, 
> vymaže, či zkopíruje kam nemá.
>
> Je možné, že když to někdo vidí poprvé, tak mu to chvíli jasné není. Jakmile to pochopí, tak je to prostě standardní konstrukce s na první pohled jasným 
> chováním, stejně jako for použitý běžným způsobem.
>
> PH
>
> Dne 06.09.2023 v 21:38 Petr Labaj napsal(a):
>> Myslím, že jde o to, jak má člověk nastaveno samohodnocení.
>> Jestli na svém interním žebříčku postoupím výše pokud napíšu fakt prďáckou konstrukci, kterou nikdo jiný napsat neumí.
>> Nebo jestli naopak postoupím tehdy, pokud napíšu program, který je každému jasný na první pohled.
>>
>> a=i--;
>> a=--i;
>>
>> je jistě správně.
>> Ale pokud napíšu
>> a=i;
>> i--;
>>
>> i--;
>> a=i;
>>
>> tak je to stejné, a zřejmě i kompilátor to přeloží stejně nebo skoro stejně.
>>
>> A otázka:
>> Který z těch zápisů je na první pohled jasnější, a kde spíš neudělám chybu? Ne v okamžiku, kdy se soustředím na kvíz, ale kdy jsem unavený a mám vytahané očí 
>> čuměním 10 hodin na monitor.
>> Který zápis bude pochopitelnější kolegovi, který sice programuje PLC, ale C viděl jen z rychlíku?
>>
>> PL
>>
>> ********************
>>
>> Dne 6.9.2023 v 21:22 Jindrich Fucik napsal(a):
>>> ...
>>> Protože pochopitelně i tohle je správný zápis:
>>> a=i--;
>>> a=--i;
>>> a kupodivu "a" se bude lišit.
>>> ...
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list