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