abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 11:44 | Zajímavý software

    NiceGUI umožňuje používat webový prohlížeč jako frontend pro kód v Pythonu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 1
    dnes 10:55 | Nová verze

    Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána ve verzi 2024.6. Z novinek lze vypíchnout lepší integraci LLM (OpenAI, Google AI, Ollama) nebo podporu Matter 1.3.

    Ladislav Hagara | Komentářů: 0
    včera 20:55 | IT novinky

    IKEA ve Spojeném království hledá zaměstnance do své nové pobočky. Do pobočky v počítačové hře Roblox. Nástupní mzda je 13,15 liber na hodinu.

    Ladislav Hagara | Komentářů: 0
    včera 10:44 | Zajímavý článek

    Alyssa Rosenzweig se v příspěvku na svém blogu Vulkan 1.3 na M1 za 1 měsíc rozepsala o novém Vulkan 1.3 ovladači Honeykrisp pro Apple M1 splňujícím specifikaci Khronosu. Vychází z ovladače NVK pro GPU od Nvidie. V plánu je dále rozchodit DXVK a vkd3d-proton a tím pádem Direct3D, aby na Apple M1 s Asahi Linuxem běžely hry pro Microsoft Windows.

    Ladislav Hagara | Komentářů: 30
    včera 01:00 | Nová verze

    Byla vydána (𝕏) květnová aktualizace aneb nová verze 1.90 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.90 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    včera 00:44 | Nová verze

    Byla vydána (Mastodon, 𝕏) nová verze 2024.2 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    5.6. 16:44 | IT novinky

    Počítačová hra Tetris slaví 40 let. Alexej Pažitnov dokončil první hratelnou verzi 6. června 1984. Mezitím vznikla celá řada variant. Například Peklo nebo Nebe. Loni měl premiéru film Tetris.

    Ladislav Hagara | Komentářů: 10
    5.6. 10:44 | Nová verze

    MicroPython (Wikipedie), tj. implementace Pythonu 3 optimalizovaná pro jednočipové počítače, byl vydán ve verzi 1.23.0. V přehledu novinek je vypíchnuta podpora dynamických USB zařízení nebo nové moduly openamp, tls a vfs.

    Ladislav Hagara | Komentářů: 0
    5.6. 10:22 | Nová verze

    Canonical vydal Ubuntu Core 24. Představení na YouTube. Nová verze Ubuntu Core vychází z Ubuntu 24.04 LTS a podporována bude 12 let. Ubuntu Core je určeno pro IoT (internet věcí) a vestavěné systémy.

    Ladislav Hagara | Komentářů: 2
    5.6. 01:00 | Nová verze Ladislav Hagara | Komentářů: 0
    Rozcestník

    Obskurní konstrukce v C++

    29.11.2017 18:27 | Přečteno: 2401× | C++ | poslední úprava: 2.12.2019 18:09

    Následující konstrukce jsou v C++ validní a asi nikoho nepřekvapí.
    while (int a = getData()) {
    
    	// kód
    
    }
    
    for (int a = getData(); a; a = getData()) {
    
    	// kód
    
    }
    
    Nicméně tohle už v C++ validní není:
    do (int a = getData()) {
    
    	// kód
    
    } while ((a = getData()));
    
    Takže nás to nutí psát ošklivé konstrukce jako třeba:
    {
    	int a = getData();
    	do {
    
    		// kód
    
    	} while ((a = getData()));
    }
    
    Smyslem je pracovat uvnitř cyklu s hodnotou proměnné a, ale podmínku testovat až na jeho konci. Přitom ale chceme mít rozsah platnosti proměnné omezen na daný cyklus. Že by po podobné konstrukci C++ byla poptávka, můžeme soudit podle dotazů zde a zde.

    Řešením může být tato obskurní knihovna. A následný kód je najednou validní.
    do (int a = getData()) {
    
        // kód
    
    } while ((a = getData()));
    
    Důležité je, že tato knihovna neporuší původní syntaxi klíčového slova do v cyklu do-while.

    Ještě dodám, že ty dvojité závorky jsou tam záměrně. Jinak by GCC vypsalo varování:

    warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    

    Pokud se vám takové konstrukce líbí, tak z tohohle a tohohle budete nadšeni.        

    Hodnocení: 67 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    29.11.2017 22:42 Dadam | skóre: 12 | blog: dadamovo
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Jaké je sdělení blogu? Že v C++ se dá psát jak prase?
    A i B mají svoje výhody a nevýhody. Vyberte si to, co vám vyhovuje víc, a necpěte A tam, kam patří B.
    29.11.2017 23:03 VM
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nevím co koho k čemu nutí, já bych to napsal buď jako
    do {
    ...
    } while( getData() );
    
    případně, pokud bych chtěl ten výsledek, tak
    int a;
    do {
    ...
    } while(( a=getData() ));
    
    30.11.2017 12:26 prqek | blog: prqek
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Přesně tohle mě napadlo. A když chci omezit platnost a, tak to celé zabalím do {}. Sice nad tím může taky kdekdo kroutit hlavou, ale pořád lepší než ta podivnost se switchem, kterou jsem snad ještě nikdy neviděl.
    30.11.2017 12:27 prqek | blog: prqek
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tak koukám, že tam tahle varianta vlastně je.
    30.11.2017 12:33 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tahle konstrukce nebude dělat co má, protože ani v jednom případě se s návratovou hodnotou nedá pracovat uvnitř cyklu (což jsem pochopil, že je cíl) a co hůř, ve druhém případě uvnitř cyklu bude proměnná a definovaná, ale během první iterace nebude mít definovanou hodnotu!
    Užívej dne – možná je tvůj poslední.
    DaBler avatar 1.12.2017 01:14 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Přesně tak. Uvedl jsem to raději přímo do textu.
    30.11.2017 02:34 Petr
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Moje oblíbená je
    a=a;
    která nejen že není syntaktickou chybou, ale pokud si implementujete vlastní rovnítko, tak s ní musíte počítat. Na druhou stranu tomuto výrazu můžete přiradit nějaký speciální význam.
    30.11.2017 10:40 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nicméně tohle už v C++ validní není:
    do {
    
    	// kód
    
    } while (int a = getData());
    
    A k čemu je tato konstrukce dobrá? Proměnná "a" vznikne až v podmínce u while na konci bloku, takže se nemůže použít uvnitř, a zanikne při opuštění cyklu.
    30.11.2017 12:43 stepan
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    +1 Autor asi nema paru, jak takovy vyraz funguje...

    while (int a = getData()) {

    // kód

    }

    Je moc uzitecna konstrukce, obdobne jako:

    if (int a = getData()) { ... }

    A za tohle bych programatora zabil:

    switch (int a = getData()) do default: {

    // kód

    } while ((a = getData()));

    Blog prispevek naprosto onicem. C++ ma milion dalsich vlastnosti, ktere by si zaslouzili hate, ale tohle zrovna ne.
    DaBler avatar 1.12.2017 01:21 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nevznikne, protože tento kód se nepřeloží.
    1.12.2017 09:53 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Už to vidím. Místo abyste se chytil za nos, tak jste dodatečně upravil svůj text:
    Nicméně tohle už v C++ validní není:
    do (int a = getData()) {
    
    	// kód
    
    } while ((a = getData()));
    Jen pro info. Toto se také nepřeloží :D.
    DaBler avatar 1.12.2017 10:01 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Vždyť to nad tím máte napsané.
    1.12.2017 10:19 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Já tam nevidím zmínku o tom, že došlo přepsání původního textu, a tudíž že moje reakce je na původní text.
    30.11.2017 13:32 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    3. varianta ma nijak neuraza. Na rozdiel od 4.
    If you hold a Unix shell up to your ear, you can you hear the C.
    30.11.2017 16:15 MadCatX
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obskurní konstrukce? To by se to taky mohlo napsat takto:
    #include <iostream>
    #include <functional>
    
    int glob = 10;
    
    template <typename TData>
    void do_loop(const std::function<TData ()> &getter, const std::function<void (TData&)> &worker)
    {
    	TData data = getter();
    	do {
    		worker(data);
    	} while ((data = getter()));
    }
    
    int main()
    {
    	int i = 65;
    
    	do_loop<int>([&]() { return glob--;}, [&](int &d){ std::cout << i + d << "\n"; });
    
    	return 0;
    }
    
    Jinak ten zápis s dvojím voláním getData() mi přijde úplně normální...
    30.11.2017 16:19 MadCatX
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obskurní konstrukce? To by se to taky mohlo napsat takto: Jinak ten zápis s dvojím voláním getData() mi přijde úplně normální...
    Myslím tu třetí možnost s do-while zabaleným scopu.
    DaBler avatar 1.12.2017 01:12 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Pěkný kód ;-)
    1.12.2017 11:18 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obávám se, že v C++ se dají napsat mnohem obskurnější konstrukce...
    1.12.2017 11:25 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Osobně mám poslední dobou s C++ problém mít přehled o všech možných kategoriích hodnot - lvalue a rvalue jsem zvládal, C++11 move semantics víceméně taky (ačkoli mi trochu chybí ta jednoduchost/přímočarost move semantics z Rustu), ale těch kategorií tam je už dost, a navíc mají některé jiný význam v C++11 a jiný v C++17... :-/
    3.12.2017 12:59 stepan
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    C++ bude zachvili tak komplexni, ze i ani autori jazyka ho nebudou znat cele.. (rekl bych ze uz ani neznaji). No radeji bych hral ruskou ruletu, nez psal parsovaci gramatiku pro C++. Bohuzel zatim neexistuje nic lepsiho (nechci rozjizdet flame, ale na veci co delam ja, tak C++ je stale superior), mozna casem D nebo Rust, ale tyhle jazyky jsou nejak firmami ignorovany.
    3.12.2017 18:33 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tak to celkem souhlas. Jsem sice fanoušek (a občasný přispěvatel) Rustu, ale nedělám si iluze, že by byl v nějaký suprový pozici. C++ i přes své vady zůstává standardem.
    Josef Kufner avatar 3.12.2017 20:11 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    C++ už tak kompexní dávno je.
    Hello world ! Segmentation fault (core dumped)
    3.12.2017 22:27 Odin
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    1. Chyba neni v pouzitem jazyku, ale v nedostatecne kvalite objektoveho navrhu. Jiste i vas mozek pri zvazeni dostupnych moznosti jazyka prijde na validni cestu.

    2. Mozna jednoduse na psani v tomto jazyce nemate. Neni to vase chyba. Ocividne c++ nerozumite. Mozna jste jen junior pracujici za par tisic, ktery ma sanci se jeste veci doucit. Kazopadne se radeji verejne neztrapnujte a bezte delat neco smysluplneho. Treba vas zamestna ten clovek, co zde kdysi psal o fastfoodu.
    DaBler avatar 3.12.2017 22:48 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Odine, možná nerozumíte významu slova obskurní. Zkuste použít slovník :)
    6.12.2017 22:00 .
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    To je na facku, vole.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.