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.
Zobrazeno 4 zpráv z 4.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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.
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.
Zobrazeno 4 zpráv z 4.