OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 17:23

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 159 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7, 8 ... 11  Další
Autor Zpráva
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 20:46 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
S tímhle jsem se setkal rozdílně u GCC a MS VC++. Teď už nevím který dělal co, ale jeden z nich vyhodnotil nejdříve cílovou adresu a pak až výraz, druhý to dělal obráceně. V ANSI C tohle není specifikované a tak to každý kompilátor dělá podle své úvahy. Obojí přístup má logické opodstatnění.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 21:25 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
V GCC mi tohle dělá to, co jsi asi chtěl:

Kód:
index = zaciatok; while (index < koniec) pole[index++] = index;

buňka   obsah
0       1
1       2
2       3


Ono je v Céčku takových věcí víc, za které norma "neručí". Tak jsem se naučil nevěřit ničemu a všechno si odzkoušet :)

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 21:45 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
faraon píše:
V GCC mi tohle dělá to, co jsi asi chtěl:

Kód:
index = zaciatok; while (index < koniec) pole[index++] = index;

buňka   obsah
0       1
1       2
2       3


Ono je v Céčku takových věcí víc, za které norma "neručí". Tak jsem se naučil nevěřit ničemu a všechno si odzkoušet :)

To je zajímavý, mně zas tohle GCC přeloží stejně nefunkční jako ten první příklad od Busyho, v tom případě to vypadá, že ani různé nebo různě nastavené verze GCC na to nemají stejný názor.
A aby ne, to je prostě nepsané pravidlo, NIKDY nepoužívat proměnnou ve výrazu vícekrát, když je s pre, či post inkrementací.
Opravdu není zaručeno, co s tím překladač udělá a taky slušný překladač to okomentuje přinejmenším warningem:
Kód:
warning: operation on 'index' may be undefined


Pokud už mám potřebu používat index s inkrementací ve výrazu, nahradím druhý výraz třeba pointrem a s tím už si můžu dělat co chci:
Kód:
index = zaciatok; typ_prvku_pole *kam=&pole[zaciatok]; while (index < koniec) *kam++ = ++index;

A tohle se přeloží správně nezávisle na kompilátoru. A člověk do toho taky může dlouho zírat a přemýšlet co to dělá :) Ale zde na to jde přijít i bez zkoušky na reálném kompilátoru !


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 22:35 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
nobomi píše:
ani různé nebo různě nastavené verze GCC

gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516

Warning samozřejmě řval "... may be undefined", takže výsledek stále nejistý a nepřenositelný.

Tvůj způsob mi funguje i bez warningů, ale je to už moc komplikované. To radši primitivní:
Kód:
index = zaciatok; while (index++ < koniec) pole[index] = index+1;

Ať se s tím optimalizátor popere podle svého.

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Naposledy upravil faraon dne 05.09.2018, 22:55, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 22:49 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.06.2013, 20:26
Příspěvky: 2487
Has thanked: 115 times
Been thanked: 424 times
Rozumím tomu dobře, že kdyby se to prostě rozepsalo třeba takhle, fungovalo by to vždycky správně?
Kód:
index = zaciatok;
while (index < koniec) {
      pole[index] = index + 1;
      index++;
      }

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 05.09.2018, 23:15 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 296
Has thanked: 12 times
Been thanked: 228 times
Jiiira píše:
Rozumím tomu dobře, že kdyby se to prostě rozepsalo třeba takhle, fungovalo by to vždycky správně?
Kód:
index = zaciatok;
while (index < koniec) {
      pole[index] = index + 1;
      index++;
      }

Přesně. Ale nejde z toho poznat, že je to v Cčku s výměnou pár znaků by to mohl být třeba pascal, java, basic, cokoliv, není tam použitá žádná nečitelná specialitka z Cčka, něco co ušetří dva znaky a totálně to znepřehlední :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 07:13 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
Ano, to je nejjistější a bude to fungovat všude. Je to vlastně totéž jako tohle:
Kód:
for (index = zaciatok; index < koniec; index++) pole[index] = index+1;

Pokud bych si chtěl ušetřit to jedno přičítání navíc (což by ale mohl odchytit optimalizátor), pomohl bych si dočasnou proměnnou:
Kód:
index = zaciatok; while (index < koniec) temp = index, pole[temp] = ++index;

A z nějakého záhadného důvodu mi funguje i tohle, dokonce bez warningů!
Kód:
index = zaciatok; while ((pole[index++] = index) < koniec);

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 07:59 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
faraon píše:
pole[index++] = index
Ale toto je tiez rovnako neiste, pretoze zalezi na kompileri - ci inkrementaciu indexu urobi uz po vyhodnoteni L-value a este pred vyhodnotenim vyrazu za =, alebo najprv vykona cele priradenie a az potom inkrementuje index.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 08:11 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
No právě, proto je mi divné že to projde bez warningů na ansi i c99, když jinak GCC hlídá každou blbost. Přitom tam mám -Wall -pedantic. Ani optimalizace s tím nehnou, prostě fo funguje.
Asi to v tomhle případě bere tak jak bych chtěl, zleva doprava :shock:

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 08:40 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
Tyhle věci ale stejně nic neušetří na rychlosti chodu programu, překladač to přeloží v podstatě stejně, ušetří to jen nějaké písmenko při zápisu. Proto raději se s překladačem domlouvat na jednoznačné úrovni, i za cenu pár písmenek navíc.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 10:54 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.06.2013, 20:26
Příspěvky: 2487
Has thanked: 115 times
Been thanked: 424 times
nobomi píše:
Jiiira píše:
Rozumím tomu dobře, že kdyby se to prostě rozepsalo třeba takhle, fungovalo by to vždycky správně?
Kód:
index = zaciatok;
while (index < koniec) {
      pole[index] = index + 1;
      index++;
      }

Přesně. Ale nejde z toho poznat, že je to v Cčku s výměnou pár znaků by to mohl být třeba pascal, java, basic, cokoliv, není tam použitá žádná nečitelná specialitka z Cčka, něco co ušetří dva znaky a totálně to znepřehlední :)

To víš, já jsem céčkový začátečník ;) - ale v tomhle případě mě vůbec nemrzí, že bych to napsal bez frajerských vychytávek a schytal za to opovržení pravých céčkařů a stoprocentní funkčnost programu, takový kšeft beru... :P

Já jsem (kromě začátků se Sinclair BASICem) vyrostl na Pascalu, který jsem se učil cca 8 let (SŠ+VŠ), a ten jsem bral prostě jako jeden z existujících programovacích jazyků - přestože jsem znal tu zkazku o tom, že pan Wirth udělal Pascal tak, aby vedl k dobrým programovacím návykům, nebral jsem ji moc vážně. Ale asi je to pravda, protože i když uznávám C jako nejvíce rozšířený jazyk (a proto se ho teď učím), tyhle jeho napůl hackerské, frajerské vychytávky mi jsou prostě proti srsti. Takže v tomto ohledu asi zůstanu napořád "začátečníkem", úmyslně a dobrovolně, a budu psát programy tak, že to bude připomínat ostatní programovací jazyky, jak píšeš. 8-)

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 11:28 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
Pascal je ukecaný, C je těsnopis.
Když pochopíš rozdíl mezi ++x a x++, abys je správně použil ve výrazu, vystačíš s tím. Kouzla začnou teprve s pointerovou aritmetikou :twisted:
Třeba tohle: https://www.pcforum.sk/pochopenie-smernikov-v-jazyku-c-vt134003.html

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 12:06 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.06.2013, 20:26
Příspěvky: 2487
Has thanked: 115 times
Been thanked: 424 times
Jo, tohle já vím: ;)
faraon píše:
Pascal je ukecaný, C je těsnopis.
Ano, a nabízí spoustu možností překlepu v těch lomítkách, závorkách atd. Když napíšeš v Pascalu třeba "bgin" místo "begin" a kompilátor tě upozorní na chybu na tom řádku, najdeš ji mnohem snadněji. Proto mi ukecanost zdrojáku nevadí.

faraon píše:
Když pochopíš rozdíl mezi ++x a x++, abys je správně použil ve výrazu, vystačíš s tím. Kouzla začnou teprve s pointerovou aritmetikou :twisted:
Třeba tohle: https://www.pcforum.sk/pochopenie-smernikov-v-jazyku-c-vt134003.html
Ten rozdíl už chápu. Ale zase - je to příležitost k zavlečení chyby, jen proto, aby se ušetřilo pár znaků a vypadali jsme jako profík. Jo, a od té doby, co Turbo Pascal 6.0 zavedl příkazy "Inc <proměnná>" a "Dec <proměnná>", jsem na ně velmi rychle přešel, a ta úspora v C oproti nim už ani není tak velká... 8-)

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 13:10 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Jiiira píše:
od té doby, co Turbo Pascal 6.0 zavedl příkazy "Inc <proměnná>" a "Dec <proměnná>", jsem na ně velmi rychle přešel
A este by tieto prikazy mohol rozsirit aby to boli funkcie, t.j. aby vracali hodnotu premennej...

...a aj pascal potom bude v tych neistych, implementacne zavislych vodach ako je teraz cecko :lol:
Kód:
vysledok := argument + Inc(argument) + argument + Dec(vysledok);


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 06.09.2018, 13:16 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Panda38 píše:
Tyhle věci ale stejně nic neušetří na rychlosti chodu programu
No to prave nie je iste. Pokial to kompiler sam cele nejak nezoptimalizuje, tak sa to zbytocne spomali jednym (zbytocnym) pripocitanim navyse, alebo manipulovanim s docasou premennou (ktora by mohla byt v registri takze to az tak nespomali, ale zase, zavisi to od kompilera).


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 159 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7, 8 ... 11  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 11 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz