Avatar
petr.dar
Člen
Avatar
petr.dar:

Zdař lidi. Možná je to blbost, ale když jsem před xxx lety programoval v pascalu tak tam byly dvojice příkazů goto a label, pomocí nichž jsem mohl libovolně přeskakovat v kódech v jedné proceduře.
v labelu jsem si napsal název části, kterou jsem v kódu označil a přes goto jsem na něj mohl odkudkoli přeskočit.
V c++ jsem se párkrát dostal do situace, kde jsem tuto možnost potřeboval, je tam nějaká možnost, nebo nějaká náhrada za ní?

 
Odpovědět 29. dubna 2:14
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na petr.dar
Jiří Gracík:

Návěstí a goto jsou v c++ taky, nicméně je to stejně jako ve většině ostatních programovacích jazycích špatná praktika a neměla by se používat.

Nahoru Odpovědět 29. dubna 3:14
Creating websites is awesome till you see the result in another browser ...
Avatar
petr.dar
Člen
Avatar
petr.dar:

super, tak to je se všim, nejen s návěstím, špatná praktika nejen v návěstích. Ale někdy to používání hodně usnadní.

 
Nahoru Odpovědět 29. dubna 3:34
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na petr.dar
David Novák:

To jo.. Ale používej to opravdu jen tehdy, když přesně víš, co děláš a taky co to udělá na úrovni vygenerovaných instrukcí.. A opravdu neskákej z funkce do funkce, nepřeskoč konstruktor, ...

Je to opravdu velmi specifická záležitost... Viděl jsem to například použité, když máš 4 úrovně cyklu (což samo o sobě naznačuje špatný návrh) a potřebuješ vyskočit a ošetřit chybu (v čistém C ovšem, tu použij výjimky) a já osobně to použil, abych stihl odevzdat projekt.. :D Ale fakt opatrně - můžeš se tím fakt nepříjemně střelit do nohy a pak hodiny hledat chybu ;)

Nahoru Odpovědět 29. dubna 10:20
Chyba je mezi klávesnicí a židlí.
Avatar
petr.dar
Člen
Avatar
petr.dar:

Tak samozřejmě, mezi funkcema to používat nehodlám, to jsem ani neměl v plánu, ani jsem netušil že to vůbec jde, ale uvnitř jedný funkce by to někdy bylo ideální.
Ale trochu jsi mě zaskočil tím, že 4 urovně cyklu jsou špatný návrh, platí to třeba i když v if () testuji více podmínek najednou a nejde použít switch?

 
Nahoru Odpovědět 29. dubna 22:34
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na petr.dar
Martin Dráb:

Ale trochu jsi mě zaskočil tím, že 4 urovně cyklu jsou špatný návrh, platí to třeba i když v if () testuji více podmínek najednou a nejde použít switch?

Řekl bych, že spíš bylo míněno, že v takovém případě (čtyři cykly, přílišné zanoření) je rozumné rozdělit kód do více funkcí.

Jinak v C se při následujícím programovacím stylu goto používá poměrně běžně, alespoň u ovladačů jádra Windows (např. v příkladech k SDK).

status = proved_funkci1(....);
if (status == chyba)
  goto Exit;

...
status = proved_funkciN(...);
if (status == chyba)
  goto Exit;
...
return status;
Exit:
  // Tady zrusime efekty zpusobene uspesnym provedenim funkci proved_funkci1, ..., proved_funkciK
  return status;

Přitom se předpokládá, že píšeš funkce tak, že tě nedostanou do nekonzistentního stavu. Tzn. když nějaká funkce v půlce svého provádění selže, tak vše vrátí do stavu před svým zavoláním a vrátí chybu.

Tenhle způsob kódování nemám moc rád (preferuju spíš zanořování), ale nevzniká žádné úroveň zanoření (nebo velmi malá) a třeba Windows Driver Framework (knihovna pro tvoru ovladačů na fyzický i virtuální HW) je pro tento styl hodně stavěná.

Na druhou stranu, v C++ se zrovna tomuto stylu dá dost dobře vyhnout tím, že se návrat do původního stavu provede v rámci destruktorů lokálních proměnných. Takže tam těch důvodů je o hodně méně.

Nahoru Odpovědět  +1 30. dubna 0:17
2 + 2 = 5 for extremely large values of 2
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 6 zpráv z 6.