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

Michal Gregor a2x1nptda8 na email.cz
Úterý Duben 21 14:33:43 CEST 2020


Ja ted opravuji stary program. Nekdo se snazil usetrit mnozstvi psani 
radku, takze napriklad udelal vunkci ktere delala asi 10 ruznych veci, 
nechybel tam prikaz goto. K tomu jeste takove srandy jako promenna s 
nazvem zlak ve skutecnosti obsahovala teplotu. Nejakych 300 radku kodu 
se po rozdeleni do vice funkci se smrsklo na 50 radku. Nehlede na to ze 
se v tom nekdo vyzna i po po par letech.

Stejna tak se moc lidem nechce rozdelovat dlouhe soubory do vice 
souboru. Coz v dobe gitu je utrpeni v pripae spoluprace vice lidi na 
jednom projektu.

Michal Gregor



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
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> 

-- 
Tato zpráva byla zkontrolována na viry programem Avast Antivirus.
https://www.avast.com/antivirus



Další informace o konferenci Hw-list