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

Tomáš Hamouz tomas.hamouz na divesoft.com
Úterý Duben 21 15:36:34 CEST 2020


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>:

 

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/c4ded3c4/attachment-0001.html>


Další informace o konferenci Hw-list