IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:18.12.2012 16:46

Neřikam že to nejde udělat jinak, ale je to podle mě přehlednější a jednodušší. Potřeba vracet se na začátek funkce (ale ne uplně na začátek) se u mě čas od času objeví, většinou u her.

 
Odpovědět
18.12.2012 16:46
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 16:53

Je to hodně o způsobu uvažování programátora. Ten, který goto nepoužívá, uvažuje stylem: "Budu ten požadavek na data opakovat, dokud nedostanu správný vstup". Programátor, který goto používá, uvažuje: "Načtu data ze vstupu a pokud je v nich chyba, vrátím se na začátek".

Argument rozdílu rychlostí je úplně mimo. Kompilátor v obou případech vygeneruje podobný kód. Pokud budu potřebovat něco skutečně rychlého (například DCT, RK4 apod.), místo C/C++ sáhnu raději po Fortranu, ve kterém se goto také už moc nepoužívá.

Nahoru Odpovědět
18.12.2012 16:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:18.12.2012 16:53

Zrovna v tehle situaci je goto prasarna.

Resit se to da treba takhle:

...
while (maFunkce()) {}
...

...
bool maFunkce()
{
    // nejaky kod, ktery neco dela

    // pokud chci tenhle kod nechat bezet znova od zacatku, tak jen zavolam
    return true;

    // pokud jsem dosel na konec a uz ho znova vykonat nechci, tak
    return false;
}
...
Editováno 18.12.2012 16:54
Nahoru Odpovědět
18.12.2012 16:53
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 17:00

Uvedený kód mi také nepřijde moc elegantní. To už bych raději použil

for(;;) {
    // nejaky kod, ktery neco dela

    // pokud chci tenhle kod nechat bezet znova od zacatku, tak jen zavolam
    continue;

    // pokud jsem dosel na konec a uz ho znova vykonat nechci, tak
    break;
}
Nahoru Odpovědět
18.12.2012 17:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:18.12.2012 17:08

V týhle situaci bych goto nepoužil. To cos ty tu napsal je jenom obyčejnej cyklus opakující se dokud funkce vrací true. Myslel sem to tak že když máš nekonečnej cyklus například (v nějaký hře), v tom cyklu jsou různý větvení a jenom z určitý větve se potřebuješ vrátit zpátky, někam na začátek funkce. Můžeš tu funkci zavolat rekurzivně, ale to mi nepřipadá moc přehledný, navíc pokud se nechceš vrátit uplně na začátek, tak bys musel řešit přeskočení tý části kterou nechceš vykonat, myslim že goto je v tomhle případě jednodušší.

 
Nahoru Odpovědět
18.12.2012 17:08
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:18.12.2012 17:15

Co by bylo elegantnejsi zalezi na situaci, i kdyz ten tvuj je asi trosku elegantnejsi.

Co se tyce toho goto - ktery kod ti prijde hezci a rychlejsi?

S goto

public static void Goto(int w, int h)
        {
            for (int i = 0; i < h; i++)
            {
            DalsiRadek:
                for (int j = 0; j < w; j++)
                {
                    for (int k = 0; k < i; k++)
                    {
                        for (int l = 0; l < j; l++)
                        {
                            // tady treba nejaky vypocty

                            if (vysledekvypoctu splnuje nejakou podminku)
                                goto DalsiRadek;
                        }
                    }
                }
            }
        }

Bez goto

public static void Goto2(int w, int h)
        {
            bool breakni = false;

            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    for (int k = 0; k < i; k++)
                    {
                        for (int l = 0; l < j; l++)
                        {
                            // tady treba nejaky vypocty

                            if (vysledekvypoctu splnuje nejakou podminku)
                            {
                                breakni = true;
                                break;
                            }
                        }

                        if (breakni) break;
                    }
                    if (breakni)
                    {
                        breakni = false;
                        break;
                    }
                }
            }
        }
Nahoru Odpovědět
18.12.2012 17:15
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:18.12.2012 17:18

Nekonečný cyklus ... větvení ... vyskočení z cyklu ... To lze i pomocí for, continue a break. Pokud skáčeš na začátek pokaždé jinam, je to prasárna.

Nahoru Odpovědět
18.12.2012 17:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 17:24

Nelíbí se mi ani jeden.

Nahoru Odpovědět
18.12.2012 17:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:18.12.2012 17:26

Kdyz se ti nelibi ani jeden, tak jak by jsi to resil? :)

Nahoru Odpovědět
18.12.2012 17:26
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:18.12.2012 17:28

Pokaždý na stejný místo ale ne uplně na začátek třeba (jelikož tam je například nějaká inicializace která se znova provádět nemá). Tak samozřejmě že to de řešit jinak, třeba breaknout se ven z toho nekonečnýho cyklu a ten dát do nějakýho do while cyklu kterej začíná v tom místě kam se chci vracet. Tim pádem by mě to z toho nekonečnýho cyklu vyhodilo za něj, a ten do while cyklus by mě vrátil zpátky. To mi ale přijde jako zbytečný psaní navíc a v případě úprav by to mohlo znamenat přepisování větší části kódu. V některých případech je prostě daleko přehlednější a jednodušší jednou napsat goto start.

 
Nahoru Odpovědět
18.12.2012 17:28
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Petr Nymsa:18.12.2012 17:54

Bez znalostí objektového programování jsem opravdu dělal programy stylem čím víc cyklů a podmínek tím víc programátor a nejlépe by se hodilo "And we need go to deeper" :D. Tudíž jsem potřeboval nějaký části kódu opakovat i na více místech. Takové byly začátky

Nahoru Odpovědět
18.12.2012 17:54
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Lukáš Hruda:18.12.2012 18:00

Já když sem psal svuj první větší program tak sem neměl páru o funkcích. Byl to poker v konzoli, hráč vs. AI. Mělo to pár chyb, ale vesměs to fungovalo. Akorát co celý bylo ve funkci main a kód měl přes 8 tisíc řádek. Ještě pořád to tu někde mam.

 
Nahoru Odpovědět
18.12.2012 18:00
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Petr Nymsa:18.12.2012 18:29

Ano takto jsem dělali různé aplikace. To byly časy :D

Nahoru Odpovědět
18.12.2012 18:29
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 19:59

Například bych vnitřní 3 cykly měl ve funkci, která by vykonávala nějaký logický celek. Z něj bych vyskakoval buď returnem, anebo výjimkou podle toho, zda by to bylo běžné řízení programu nebo chyba. Vně funkce bych na tyto události reagoval a řídil podle nich další zpracování.

To, co jsi tady předvedl, je tzv. předčasná optimalizace. Která, jak známo, vede do pekel. Kromě toho to máš v obou případech chybně. Dojde k zacyklení.

Nahoru Odpovědět
18.12.2012 19:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:18.12.2012 20:03

Totéž jako u Luboš Běhounek Satika. Mé algoritmy mě nikdy nedostanou do situace, kdy bych potřeboval takové obskurní řešení ať již s goto nebo bez něho. Možná je to použitelné u assembleru, ale do vyšších programovacích jazyků takové zlozvyky nepatří.

Nahoru Odpovědět
18.12.2012 20:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek Satik:18.12.2012 20:28

Kdyz by to skakani bylo treba jen pred druhej cyklus, a vnitrni cykly treba casto behaly jen do malych cisel, tak by ta rezie volani funkce uz mohla byt na rychlosti docela znat (obzvlast v nenativnich jazycich). A zachytavani vyjimek ma rezii jeste vetsi. Potom muze mit v kodu svoje misto goto, ktera se do assembleru ve vetsine pripadu prelozi jako jedina instrukce (JMP).

Me optimalizace bavi, uz se mi parkrat stalo, ze jsem zacal funkci kvuli rychlosti prepisovat do assembleru, ale je pravda, ze obcas to uz trochu prehanim :)

A k zacyklení v tech ukazkach nedojde (a stejne to byly jen vymysleny ukazkovy kody)

Nahoru Odpovědět
18.12.2012 20:28
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:18.12.2012 20:42

Režije volání funkce se dá eliminovat tak, že ta funkce bude inline. Pokud kód tý funkce jako takový nemá vliv na rychlost.

 
Nahoru Odpovědět
18.12.2012 20:42
Avatar
Luboš Běhounek Satik:18.12.2012 20:45

Nektere jazyky (napr. C#) bohuzel __forceinline neumi, jinak samozrejme pro casove kriticke casti kodu je to super vec a pak ta cast kodu muze byt i ve funkci.

Nahoru Odpovědět
18.12.2012 20:45
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 20:52

Od té doby, kdy jsem se vykašlal na optimalizace, jsou mé programy rychlejší. Asi proto, že svou pozornost nesoustřeďuji na pochybné optimalizace, ale na algorimus úlohy.

Je úplně zbytečné snažit se optimalizovat něco, co je mimo vnitřní cykly.

Editováno 18.12.2012 20:54
Nahoru Odpovědět
18.12.2012 20:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:18.12.2012 21:00

Je to docela hodně znát. Třeba když sem pro quick sort v C++ používal na prohození hodnot funkci, pokud nebyla inline zabralo řazení skoro 2x víc času.

 
Nahoru Odpovědět
18.12.2012 21:00
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:18.12.2012 21:04

A divíš se? Proč myslíš, že nesnáším primitivní gettery a settery?

Nahoru Odpovědět
18.12.2012 21:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:18.12.2012 21:11

Settery a gettery dělam zásadně inline. V C++ je každá členská funkce definovaná v bloku třídy automaticky inline a takhle krátky funkce se uvnitř většinou definujou, takže na to ani nemusíš myslet.

 
Nahoru Odpovědět
18.12.2012 21:11
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:18.12.2012 21:23

A já ty primitivní pro jistotu nedělám vůbec. Nikdy nepotřebuji nastavit jednu hodnotu a nikdy nepotřebuji přečíst jednu hodnotu.

Například u souřadnic je hloupost nastavovat zvlášť setX(x) a setY(y), když to můžu nastavit naráz setXY(x,y). Je například chybné psát

x=obj.getX();
x=x+rychlostX;
obj.setX(x);
y=obj.getY();
y=y+rychlostY;
obj.setY(y);

když můžu udělat daleko pohodlněji

obj.addXY(rychlostXY);

Na takových primitivních operacích se ztrácí nejvíc času.

Nahoru Odpovědět
18.12.2012 21:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 73.