NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: výjimka pro neplatný index []

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
petr.dar
Člen
Avatar
petr.dar:22.7.2016 12:10

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.7.2016 12:10
Avatar
Odpovídá na petr.dar
Patrik Valkovič:22.7.2016 15:08

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
22.7.2016 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 Valkovič
petr.dar:23.7.2016 12:31

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.7.2016 12:31
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na petr.dar
Martin Dráb:23.7.2016 17:22

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
23.7.2016 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.