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;    --ebben a sablon csomagban van 
 
procedure veletlen is 
    type randomtipus is integer range 1..20--most 1..20 intervallumban randomolunk értéket 
    package rand is new ada.numerics.discrete_random(randomtipus);    --mindig olyan típussal kell példányosítani, aminek az értékhalmazából szeretnénk randomértékeket kapni. Pl boolean random esetén egyszerűen csak a boolean típussal példányosítjuk 
    use rand; 
 
    G : generator;    --ez a változó alapján generálja a véletlenszámot 
    x : randomtipus; 
 
begin 
    reset(G);    --inicializálja a véletlenszámsorozatot, csak a program elején, egyszer kell meghívni 
    x := random(G);    --generál egy véletlenszámot. 
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_ErrorValamilyen megszorítás megsértése esetén fordul elő. pl.: x : natural := -1;
Program_ErrorOlyan 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_ErrorNincs elég memória.
Tasking_ErrorTaskok közötti kommunikációs hiba
 
Saját kivétel deklarálása
 
     : exception;    --ez a deklarációsrészbe kerül (mintha egy változót deklarálnánk 
 
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 
            --itt nincs lekezelve a kivétel 
        end B; 
    begin 
        ut1; 
        ut2; 
        B; 
        ut3; 
    exception 
        when kiv => kivetelkezelő_utasítások; --tehát, ha itt lekezeljük a kivételt, akkor a vezérlés ut12-nél folytatódik, mert az az A eljárást tartalmazó blokk következő utasítása, ha itt mégsem kezeljük le, akkor pedig a vezérlés (1)-be megy. 
    end A; 
 
begin 
    ut10;     
    declare 
        ... 
    begin 
        ut11; 
        A; 
        ut12; 
    exception --(1) 
        when kiv => kivetelkezelő_utasítások; --ha itt kezeljük le, akkor a vezérlés az ut13-nál folytatósik, ha itt sem, akkor pedig (2)-nél 
    end
    ut13; 
exception --(2) 
    when kiv => kivetelkezelő_utasítások; --ha csak itt kezeljük le, akkor mindenféleképpen vége lesz a programnak, mert ez a legkülső blokk, csak ha lekezeljük akkor nem hibaüzenettel száll el, hanem lefut az ide írt programunk és kilép. 
end main 
 

Példaprogramok

 
Vissza a főoldalra