http://www.adaconcept.com/programs/elfedes_es_atadas/elfedes_es_atadas.adb
-- Rotter Gyorgy
-- Ebben a programban peldakat mutatunk arra, hogy a csomagok hierarchikus felepitese
-- hogyan befolyasolhatja az egyes entitasok lathatosagat,
-- valamint a parameteratadassal kapcsolatban is melyitjuk az ismereteinket
-- Figyelmesen tanulmanyozzuk a forraskodot, es a program kimenetet!

with Ada.Text_IO;

with Alap_Csomag;
with Alap_Csomag.Teszt;



procedure elfedes_es_atadas is

begin
   Ada.Text_IO.Put_Line("Program indul");                                                          -- itt hivatkozhatunk az Ada.Text_IO csomagra...

   Alap_Csomag.Muvelet;                                                                            --| amikor csak ezeket a sorokat latjuk, nem tudjuk eldonteni, hogy egy
   Alap_Csomag.Teszt;                                                                              --| "beagyazott/tartalmazott vagy leszarmazott valamirol" van szo


   Ada.Text_IO.Put_Line("-----------------------------------------------------------");


   Limited_Atadast_Bemutato_Resz:                                                                  -- (cimke) nevvel ellatott declare-blokk
   declare

      type Rekord_Tipus is record  --limited record                                                -- probaljuk ki ugy is, hogy a rekordot limited -nek deklaraljuk!!! (Limited tipusra nincsen ertelmezve az ertekadas sem ... :) )
         I : Integer;                                                                              -- Ada 2005: emlekezzunk a kiterjesztett return utasitasra
      end record;


      Globalis_R : Rekord_Tipus;


      procedure Muvelet (R : in out Rekord_Tipus) is                                               --| gondoljuk meg, ha a formalis parameter neve megegyezne a globalis (non-lokalis) valtozo nevevel az elfedes miatt
      begin                                                                                        --| egy nehezen felderitheto hibaba is belefuthatnank...
         Ada.Text_IO.Put_Line("belul elotte: " & Integer'Image(R.I));                              -- R.I=5

         R.I:=7;

         Ada.Text_IO.Put_Line("belul utana: " & Integer'Image(R.I));                               -- R.I=7
         Ada.Text_IO.Put_Line("belul utana (globalis): " & Integer'Image(Globalis_R.I));           -- R.I=5  vagy limited rekord eseten R.I=7
      end Muvelet;


   begin
      Globalis_R.I:=5;
      Ada.Text_IO.Put_Line("kivul elotte (globalis): " & Integer'Image(Globalis_R.I));             -- R.I=5
      Muvelet(Globalis_R);
      Ada.Text_IO.Put_Line("kivul utana (globalis): " &Integer'Image(Globalis_R.I));               -- R.I=7
   end Limited_Atadast_Bemutato_Resz;


   Ada.Text_IO.Put_Line("-----------------------------------------------------------");


   Indefinit_Tomb_Mint_Kimeno_Parameter:                                                           -- (cimke) nevvel ellatott declare-blokk
   declare

      type Integer_Tomb_Tipus is array(Integer range <>) of Integer;

      Tomb : Integer_Tomb_Tipus(1..5) := (others => 1);


      procedure Muvelet (  T1 : in Integer_Tomb_Tipus; T2 : out Integer_Tomb_Tipus) is

      begin
         -- a T1 tomb kiirasa
         for i in T1'Range loop
            Ada.Text_IO.Put(Integer'Image(T1(i)));
         end loop;
         Ada.Text_IO.New_Line;

         T2(T2'First) := 7;                                                                        -- figyeljuk meg, hogy bar a T2 parameter out tipusu, van "bemeno adat" is (T2'First) !

         -- a T1 tomb kiirasa
         for i in T1'Range loop
            Ada.Text_IO.Put(Integer'Image(T1(i)));                                                 -- figyeljuk meg, hogy a hivas hatasara megvaltozott egy in modu parameter!
         end loop;
         Ada.Text_IO.New_Line;
      end Muvelet;


   begin

      declare
         Tomb : Integer_Tomb_Tipus(7..10) := (others => 5);                                        -- elfedtuk a "kulso" 'Tomb' nevet
                                                                                                   -- a "kulso" tombot Indefinit_Tomb_Mint_Kimeno_Parameter.Tomb neven erhetnenk el.  pl. ezert lehet hasznos nevvel ellatott declare-blokk-ot irni
      begin

         Muvelet(Tomb, Tomb);                                                                      -- mindket parameternek a lokalis Tomb -ot adjuk

      end;

   end Indefinit_Tomb_Mint_Kimeno_Parameter;


   Ada.Text_IO.Put_Line("-----------------------------------------------------------");


   Fuggveny_Parameterenek_Megvaltoztatasa:
   declare

      -- Csak nagyon indokolt esetben csinaljunk ilyet!!!
      type Rekord_Tipus;
      type Rekord_Mutato_Tipus is access all Rekord_Tipus;
      type Rekord_Tipus is record                                                                  -- tehat a rekord tartalmazni fog egy mutatot magara...
         Mutato : Rekord_Mutato_Tipus := null;                                                     -- ha ez a sor a rekord diszkriminansakent szerepel, es -gnat95 forditasi kapcsolot hasznalunk, CONSTRAINT_ERROR lep fel
         I : Integer;
      end record;


      function Fuggveny(I : access Integer) return Boolean is
      begin
         I.all := 7;

         return True;
      end Fuggveny;


      function Fuggveny(R : in Rekord_Tipus) return Boolean is
      begin
         R.Mutato.all.I := 7;

         return True;
      end Fuggveny;

      I : aliased Integer;
      Rekord : aliased Rekord_Tipus;

   begin
      I := 5;
      Rekord := ( Mutato => Rekord'Access, I => 5 );                                               -- ((CONSTRAINT_ERROR))

      Ada.Text_IO.Put_Line(Integer'Image(I));                                                      -- I=5
      Ada.Text_IO.Put_Line(Integer'Image(Rekord.I));                                               -- Rekord.I=5
      if Fuggveny(I'Access) or Fuggveny(Rekord) then                                               -- RENDKIVUL VESZELYES hivas! moho kiertekeles.. nezd meg mi tortenik lusta kiertekeles (or else) eseten!
         Ada.Text_IO.Put_Line(Integer'Image(I));                                                   -- I=7
         Ada.Text_IO.Put_Line(Integer'Image(Rekord.I));                                            -- Rekord.I=7 vagy "or else" Rekord.I=5
      end if;
   end Fuggveny_Parameterenek_Megvaltoztatasa;


   Ada.Text_IO.Put_Line("Program vege");
end elfedes_es_atadas;