verem.ads
generic
type elem is private;
package verem is
subtype int is integer range 1..100;
type stack(size : int := 10) is private;
STACK_FULL : exception;
STACK_EMPTY : exception;
procedure pop(s : in out stack; e : out elem);
procedure push(s : in out stack; e : in elem);
procedure top(s : in stack; e : out elem);
function isEmpty(s : in stack) return boolean;
function isFull(s : in stack) return boolean;
private
type stack_vect is array(int range <>) of elem;
type stack(size : int := 10) is record
v : stack_vect(1..size);
i : integer := 0;
end record;
end verem;
verem.adb
package body verem is
procedure pop(s : in out stack; e : out elem) is
begin
if s.i < 1 then
raise STACK_EMPTY;
end if;
e := s.v(s.i);
s.i := s.i - 1;
end pop;
procedure push(s : in out stack; e : in elem) is
begin
if s.i = s.size then
raise STACK_FULL;
end if;
s.i := s.i + 1;
s.v(s.i) := e;
end push;
procedure top(s : in stack; e : out elem) is
begin
e := s.v(s.i);
end top;
function isEmpty(s : in stack) return boolean is
begin
return s.i = 0;
end isEmpty;
function isFull(s : in stack) return boolean is
begin
return s.i = s.size;
end isFull;
end verem;
mainverem.adb
with ada.text_io, verem;
use ada.text_io;
procedure mainverem is
package iverem is new verem(integer);
use iverem;
s : stack(15);
e : integer;
begin
for i in 1..15 loop
push(s,i);
end loop;
for i in 1..15 loop
pop(s,e);
put_line(integer'image(e));
end loop;
exception
when STACK_FULL => put_line("HIBA!! A verem tele");
when STACK_EMPTY => put_line("HIBA!! A verem ures");
end mainverem;
VISSZA