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;