Re: Chyba v C - velmi podivné chování

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Duben 21 20:18:04 CEST 2020


A dokonce i pri vicenasobnem pouziti. Neresil bych problemy, ktere ma v 
popisu prace optimalizace kompilatoru. A cim vic textu, tim casto lip a 
prehledneji...

Dne 21.04.2020 v 20:10 Miro su napsal(a):
> Niektore kompilatory urobia inline aj pri funkciach kde je obsluha 
> vacsia ako samotna funkcia.
>
> Miro
>
> On Tue, 21 Apr 2020, 15:37 Tomáš Hamouz, <tomas.hamouz na divesoft.com 
> <mailto:tomas.hamouz na divesoft.com>> wrote:
>
>     A navíc slušný kompilátor inlinuje zcela automaticky funkci, která
>     je static a použitá jen jednou.
>
>     Tomáš
>
>
>
>     	k tomu prave slouzi treba ten inline
>
>     t
>
>     21. 4. 2020 v 14:42, Vláďa Anděl <vaelektronik na vaelektronik.cz
>     <mailto:vaelektronik na vaelektronik.cz>>:
>
>     
>
>     No já nemohu říkat, že znám céčko :-) protože nepíšu pro PC, ale
>     jen pro malé jednočipy obvykle s malou pamětí pro data, zatím co
>     code obvykle zdaleka celé nevyužiju. Takže sice vím, že každou
>     blbost bych měl psát zvlášť jako funkci a pak ji volat, ale vadí
>     mi že u krátkých funkcí (pár řádků) se běh programu prodlouží o
>     volání + návrat z funkce a o uschovávání + obnovení obsahu
>     registrů. K tomu ještě se (zbytečně) zaplňuje stack a tak v mém
>     programu najdete třeba něco takového
>
>     ADC0CN0=0x80;                // ADC0 zapnuty
>     ADINT=0;
>     ADBUSY=1;                        // 1. mereni
>     while(!ADINT);
>     Potenc=ADC0;
>     ADC0CN0=0;                    // ADC0 vypnuty
>
>     PCON=1;                            // t=1,11 ms  cekani v IDL
>
>     ADC0CN0=0x80;                // ADC0 zapnuty
>     ADINT=0;
>     ADBUSY=1;                        // 2. mereni
>     while(!ADINT);
>     Potenc+=ADC0;
>     ADC0CN0=0;                    // ADC0 vypnuty
>
>     PCON=1;                            // t=2,22 ms
>
>     ADC0CN0=0x80;                // ADC0 zapnuty
>     ADINT=0;
>     ADBUSY=1;                        // 3. mereni
>     while(!ADINT);
>     Potenc+=ADC0;
>     ADC0CN0=0;                    // ADC0 vypnuty
>
>     Zrovna tenhle prográmek mi běží s oscilátorem 80 KHz a časově je
>     to tam dost na těsno - samosřejmě kritická je spotřeba procesoru.
>
>     Anděl
>
>
>     Dne 21.04.2020 v 13:29 Tomáš Hamouz napsal(a):
>     Názvy #define jsem použil nějaké, které mě napadly, ale jak jsem
>     psal, nevím co původní výraz ve skutečnosti
>     vyhodnocuje, podle toho bych použil lepší názvy. Chtěl jsem tím
>     naznačit že do vlastního kódu nepatří žádná konstanta,
>     která ovlivňuje použitý algoritmus, s několika drobnýma výjimkama.
>
>     Stejně tak název té funkce nemá vyjadřovat všechny v něm použité
>     podmínky, ale k čemu je toto porovnání dobré.
>
>     A opět jak jsem psal, možná by bylo lepší porovnání s tou trojkou
>     strčit rovnou do té funkce, ale bez znalosti kontextu jen hádám.
>
>     Je to zcela bez ohledu na firemní kuluru, jak stárnu tak používám
>     zcela samovolně čím dál tím delší identifikátory.
>     Může to být i tím že se u mne rozmáhá skleróza a už si prostě řadu
>     detailů nepamatuju.
>
>     Tomáš
>
>
>
>     	No jo, ale to pak na místě použití není vidět, jaké že ty
>     podmínky jsou. Předpokládám, že funkce bude dle firemních pravidel
>     definována v nějakém externím souboru. Nedej bože, když takových
>     sad podmínek bude víc. To pak budou názvy těch funkcí tak dlouhé,
>     že určitě poruší nějaké délkové pravidlo, ohledně délky řádku:-)
>
>     Normálně bych pro zvýšení přehlednosti dal mezery okolo + (což
>     jsem ale pro zabránění zalomení v mailu vynechal). Uvažoval bych
>     ještě o další závorce okolo součtu.
>
>     Použití funkce pro mě přehlednost jasně snižuje:-) Navíc
>     MIN_A_COUNT aREMAING_COUNT jsou vyloženě matoucí názvy pro
>     podmínky nesouvisející s count:-) Jinak teda proti použití define
>     nic nenamítám, běžně používám, ale zas je to zbytečná komplikace
>     do ukázky typu kódu v mailu.
>
>     K čemu teda máme různé jazyky, když bychom nemohli využívat jejich
>     výhod?
>
>     PH
>
>
>     *Od: *Tomáš Hamouz <mailto:tomas.hamouz na divesoft.com>
>     Myslím že lepší otázka zní, jak to napsat tak aby bylo na první
>     pohled jasné co daný výraz vyhodnocuje,
>     bez ohledu na počet písmenek.
>
>     Abych planě nekritizoval, nejspíš bych to udělal takhle, ale
>     protože nevím účel celé konstrukce,
>     tak by bylo třeba lepší zahrnout i porovnání s trijkou. Podmínku
>     malého počtu písmenek zcela zjevně
>     nesplňuju, ale to zcela záměrně, protže bych se v tom rád vyznal i
>     po několika letech kdy jsem to neviděl.
>
>
>     #define   MIN_A_COUNT               2  // vyznam teto konstanty
>     #define   REMAING_COUNT       12        // vyznam teto konstanty
>     #define   MINIMAL_COND_COUNT   3        // vyznam teto konstanty
>
>     static inline int count_test_conditions(int a, int b, int x, int y)
>     {
>         int count = 0;
>         if (a < MIN_A_COUNT) {++count;}        // oduvodneni teto podminky
>         if (a > b) {++count;}                  // oduvodneni teto podminky
>         if (x < y) {++count;}                  // oduvodneni teto podminky
>         if ((a%x) == REMAING_COUNT) {++count;} // oduvodneni teto podminky
>         if (b < y) {++count;}                  // oduvodneni teto podminky
>         return count;
>     }
>
>     if (count_test_conditions(a, b, x, y) > 3) {
>     }
>
>
>     A bylo by docela zajímavé se podívat jak se liší zkompilovaný kód
>     v obou případech.
>     Myslím že by tam velké rozdíly nebyly.
>
>
>
>     	Otázka tedy zní, jak ho upravit, aby prošel a přibylo co nejméně
>     písmenek:-)
>
>     PH
>
>     *Od: *as5sgm na gmail.com <mailto:as5sgm na gmail.com>
>     >>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y) > 3) {
>     Tento riadok kodu by nepresiel review a ani MISRA rules, vsade kde
>     su aspon dvaja vyvojari :)
>     Miro
>
>     On 21. 4. 2020 10:37, Pavel Hudecek wrote:
>     Vzhledem ke komutativnosti sčítání by pořadí mělo bejt
>     irelevantní, kromě toho posledního >, ale to má nižší prioritu než
>     +, takže se musí vyhodnotit jako poslední.
>
>     No a že to nebude fungovat v jiných jazycích? To je snad normální.
>     Nebo všechny mají ++, printf, pointery jako Delphi, nepotřebují
>     deklarovat proměnné jako VB6, … ?
>
>     Příkazů je tam 0, takže omezení na max. jeden na řádek to taky
>     nepřekračuje.
>
>     PH
>
>     *Od: *Michal Gregor <mailto:a2x1nptda8 na email.cz>
>     Spravne se maji slozite podminky prevest do funkci. Plati zasada
>     jeden
>     radek jeden prikaz. A nespolehat se na interni "tajne" funkce
>     compilatoru. Co kdyz to nekdo skopiruje do C++? Nebo do uplne
>     jineho jazyja.
>
>
>     Dne 21.04.2020 v 8:46 Jan Waclawek napsal(a):
>     > A nemohlo to byt skor o tom, ze v takychto vyrazoch
>     >
>     >>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y) > 3) {
>     >
>     > nie je zarucene poradie vyhodnotenia pod-vyrazov, aj keby mali
>     vedlajsie
>     > efekty?
>     >
>     > wek
>     >
>     >
>     > ----- Original Message ---------------
>     >> Sa vam dvom do toho zamontujem, som nieco nasiel vo svojom
>     archive, ale
>     >> Ty si mimo podozreni :)
>     >> Skor si ja pofajcim, ze uz kedy som daval do placu citat z
>     normy, ktory
>     >> si teraz dal aj Ty :-D
>     >>
>     >> https://list.hw.cz/pipermail/hw-list/2011-July/399004.html
>     >> 
>     >> miro
>     >>
>     >> On 21.4.2020 1:17, Jan Waclawek wrote:
>     >>> Hm, tak ja vidim vyhody skor v tych 6 ifoch a 1 pomocnej
>     premennej...
>     >>>
>     >>> Ale ak by si nahodou nasiel odkaz, kde ten JW z minulosti
>     povedal, ze
>     >>> vysledkom podmienky nemusi byt 0 alebo 1, tak by som Ti bol
>     vdacny.
>     >>>
>     >>> wek
>     >>>
>     >>>
>     >>> ----- Original Message ---------------
>     >>> Tak?e se po pár misících mu?u vrátit k tomu, ?e jedna z výhod
>     C je mo?nost
>     >>> dilat vici, jako:
>     >>>
>     >>> If ((a<2)+(a>b)+(x<y)+(a%x==12)+(b<y)>  3) {
>     >>>
>     >>> Co? v jiných jazycích vede na 6 ifu a 1 pomocnou prominnou.
>     >>>
>     >>> PH
>     >>>
>     >>> Od: Jan Waclawek
>     >>>
>     >>> Hm, tak potom by som mal asi tomu JW z minulosti jednu tresnut...
>     >>>
>     >>> Konkretne teda, C99, 6.5.8 Relational operators #6:
>     >>> Each of the operators<  (less than),>  (greater than),<= (less
>     than or
>     >>> equal to), and>=
>     >>> (greater than or equal to) shall yield 1 if the specified
>     relation is true
>     >>> and 0 if it is false. 92)
>     >>> The result has type int.
>     >>>
>     >>> Ten footnote 92) je kuzelny:
>     >>>    The expression a<b<c is not interpreted as in ordinary
>     mathematics. As the
>     >>> syntax indicates, it
>     >>> means (a<b)<c; in other words, ??if a is less than b, compare
>     1 to c;
>     >>> otherwise, compare 0 to c??.
>     >>>
>     >>> wek
>     >>>
>     >>>
>     >>> ----- Original Message ---------------
>     >>>
>     >>> Mil jsem nijak za to, ?e to byl právi jistý JW, kdo mi tu
>     onehdá vyeetl, ?e
>     >>> spoléhat se, ?e výsledkem podmínky je 0 nebo 1 není správné:-)
>     >>>
>     >>> PH
>     >>>
>     >>> Od: Jan Waclawek
>     >>>
>     >>>> A jinak teda ten kód udilá to, ?e pokud je splnina podmínka v
>     závorce, nastaví se bit 0 na výstupní (zda to bude bit 0 není
>     zarueeno, ale jinak skoro jisté).
>     >>>
>     >>> Preco by to nemal byt bit 0?
>     >>>
>     >>> _______________________________________________
>     >>>
>     >>>>>
>     >>>>>     DDRB |=(1<CLK_UP);
>
>
>
>
>     _______________________________________________ HW-list mailing
>     list  -  sponsored by www.HW.cz
>     <http://www.HW.cz>Hw-list na list.hw.cz
>     <mailto:Hw-list na list.hw.cz>http://list.hw.cz/mailman/listinfo/hw-list
>
>     _______________________________________________
>     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     http://list.hw.cz/mailman/listinfo/hw-list
>     _______________________________________________
>     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
>     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> 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/20200421/f6cf37db/attachment.html>


Další informace o konferenci Hw-list