Vissza a főoldalra
Segédanyag a 6. gyakorlathoz
Tartalom:
Véletlenszám generálás
Diszkrét véletlenszám generátor
Használatát nézzük az alábbi példán:
with ada.numerics.discrete_random;
procedure veletlen
is
type randomtipus
is integer
range 1..20;
package rand
is new ada.numerics.discrete_random(randomtipus);
use rand;
G : generator;
x : randomtipus;
begin
reset(G);
x := random(G);
end veletlen;
Valós véletlenszám generátor
Használata a diszkrét fajtához hasonlít, különbség az, hogy itt az ada.numerics.float_random csomagot kell használni. Ez nem sablon csomag, így rögtön használható, és a 0.0..1.0 intervallumban ad véletlenszámot.
Kivételkezelés
Programozás során, amikor önálló modult írunk figyelni kell arra az esetre is, amikor a modulunk felhasználója nem megengedett alprogramot hív meg. (Pl. üres verem esetén a pop műveletet.) Eddigi példáinkban feltettük, hogy ilyen nem következik be, azaz a felhasználó tudja, hogy ilyet nem tehet, de ez nagy projektekben nem járható út. Erre egy megoldás, hogy vagy egy extremális értékkel térünk vissza, vagy egy hiba változó állítunk be. E módszer hátránya az, hogy a felhasználót semmi sem kényszeríti, hogy figyelembe vegye hibajelzésünket. A másik probléma a hibaellenőrzéssel van, nagyon elbonyolítja a kódot. Ráadásul egy olyan dolog miatt teszi, ami az esetek döntő többségében nem is következik be. Az ADA az ilyen esetekre a kivételkezelést ajánlja, azaz válasszuk szét a kódban a normális működést a kivételes esettől. Ha tehát valami nemkívánatos esemény következik be, a vezérlés a kivételes ágba kerül, és onnan csak akkor jut vissza, ha ott lekezeljük a hibát, így a felhasználót is rákényszeríthetjük a hiba figyelembevételére.
Alap kivételek az Adában
Constraint_Error | Valamilyen megszorítás megsértése esetén fordul elő. pl.: x : natural := -1; |
Program_Error | Olyan alprogramot szeretnénk aktivizálni, aminek még nem értékeltük ki a törzsét, vagy függvény futása befejeződött, de nem volt return utasítás. |
Storage_Error | Nincs elég memória. |
Tasking_Error | Taskok közötti kommunikációs hiba |
Saját kivétel deklarálása
: exception;
Kivétel kiváltása
raise ;
Kivétel lekezelése
Minden blokknak van / lehet egy exception ága, és kivétel esetén a vezérlés oda adódik át. Ha ott lekezeljük a kivételt, akkor a vezérlés a külső blokk (az a blokk amely tartalmazza azt a blokkot amiben lekezeltük a kivételt) normális részében folytatódik, ha nem kezeltük le, akkor pedig a külső blokk kivételes részében. Ha ott sem kezeltük le akkor megy még kiljebb, amíg van blokk, ha kilép a legkólső blokkból is, akkor valamilyen hibaüzenette terminál a program
Példa a kivétel kezelésre
procedure main is
kiv : exception;
procedure A is
procedure B is
begin
...
...
raise kiv;
exception
end B;
begin
ut1;
ut2;
B;
ut3;
exception
when kiv => kivetelkezelő_utasítások;
end A;
begin
ut10;
declare
...
begin
ut11;
A;
ut12;
exception
when kiv => kivetelkezelő_utasítások;
end;
ut13;
exception
when kiv => kivetelkezelő_utasítások;
end main
Példaprogramok
Vissza a főoldalra