Avatar
petr.dar
Člen
Avatar
petr.dar:

Zdárec,
Víte někdo, jak ošetřit chybu pro výskyt neplatného indexu pro pole [], když překročim jeho maximální hodnotu?
V Mistrovství C++ píšou, že se používá výjimka out_of_bounds, ale ve standardní knihovně ji nikde nemůžu najít ...

 
Odpovědět 22. července 12:10
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na petr.dar
patrik.valkovic:

Pro pole se nic takového neděje. Pole si musíš hlídat sám. Co se týče standardních šablonových tříd, tak tam by se měla používat out_of_range (http://www.cplusplus.com/…ut_of_range/) výjimka.

Nahoru Odpovědět  +2 22. července 15:08
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
petr.dar
Člen
Avatar
Odpovídá na patrik.valkovic
petr.dar:

No tak jó no, je to škoda, že to nejde přes výjimku, usnadnilo by to mému prográmku spoustu výpočtů. Díky za info.

 
Nahoru Odpovědět 23. července 12:31
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na petr.dar
Martin Dráb:

V C/C++ (a jiných jazycích kompilovaných přímo do strojového kódu) překladač u pole často předem netuší, jak je velké. Takže ti nemůže říci, že lezeš mimo rozsah. Zápis či čtení do/z pole se může přeložit jako jedna instrukce, pokud mají prvky pole rozumnou velikost (1, 2, 4, 8 bajtů myslím) a index, se kterým se pracuje, se ani nemusí nikam ukládat do paměti.

Samozřejmě by šlo při alokaci pole uložit někam i jeho velikost a pak kontrolovat při indexování. A to právě dělají kontejnery (std::vector např.). Je to ale pomalejší než způsob popsaný v odstavci výše. Navíc můžeš paměť alokovat i tak, že se překladač vlastně ani nedozví, že se jedná o pole... a pak s ní jako s polem pracovat.

Architektura ia32 (iamd64/x64) obsahuje instrukci na kontrolu rozsahu pole, ale to právě musí být známa jeho velikost. Myslím, že i třeba ve Visual Studiu toto jde zapnout (ve starém dobrém Borland Pascalu už to také měli).

Krátce řečeno, pokud chceš pole s těmito vlastnostmi, používej nějaký složitější kontejner... ale ověř si, že vyhazují výjimky, někdy to dělá jenom při překladu v debug režimu. Holt se takhle s výjimkama v C++ neprogramuje.

Nahoru Odpovědět  +1 23. července 17:22
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 4 zpráv z 4.