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

Turbyho turbyho na gmail.com
Úterý Duben 21 14:47:16 CEST 2020


k tomu prave slouzi treba ten inline

t

> 21. 4. 2020 v 14:42, Vláďa Anděl <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 a REMAING_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
>> 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
>> >>> 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
>> 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
>> 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/d30eadf0/attachment.html>


Další informace o konferenci Hw-list