HP Pascal/iX Programmer's Guide (31502-90023)

6- 13
intpointer = ^integer;
VAR
b : Boolean;
i : integer;
ptr1,
ptr2 : intpointer;
PROCEDURE p_getheap (VAR regptr : intpointer;
regsize : integer;
alignment : integer;
VAR ok : Boolean); EXTERNAL;
PROCEDURE p_rtnheap (VAR regptr : intpointer;
regsize : integer;
alignment : integer;
VAR ok : Boolean); EXTERNAL;
BEGIN
p_getheap(ptr1,40,4,b); {allocate a 40-byte region}
ptr2 := ptr1; {save ptr1 for later call to p_rtnheap}
FOR i := 1 TO 10 DO BEGIN
ptr2^ := i;
ptr2 := addtopointer(ptr2,4);
END;
p_rtnheap(ptr1,40,4,b); {deallocate the 40-byte region}
p_getheap(ptr1,50,2,b);
p_rtnheap(ptr1,20,2,b); {illegal -- 20 must be 50}
p_getheap(ptr1,16,8,b);
p_rtnheap(ptr1,16,1,b); {illegal -- 1 must be 8}
END.
The procedures
p_getheap
and
p_rtnheap
are independent from the
procedures
mark, release, new,
and
dispose
.
Example 2
$STANDARD_LEVEL 'HP_MODCAL'$
PROGRAM prog;
VAR
i : integer;
b : Boolean;
p1,p2,p3,
ptr1, ptr2, ptr3 : ^integer;
PROCEDURE p_getheap; INTRINSIC;
PROCEDURE p_rtnheap; INTRINSIC;
BEGIN
p_getheap(ptr1,28,4,b); {allocate a 28-byte region}
ptr3 := ptr1; {assign values in the 28-byte region}
FOR i := 1 TO 7 DO BEGIN
ptr3^ := i;
ptr3 := addtopointer(ptr3,4);
END;
ptr3 := ptr1;
mark(ptr2); {mark the heap}
new(p1); {allocate p1, p2, and p3}
new(p2);
new(p3);
p_rtnheap(ptr1,28,4,b); {deallocate the 28-byte region}
ptr3^ := 0; {illegal -- p_rtnheap deallocated ptr3^}
p1^ := 1; {p_rtnheap did not deallocate p1, p2, or p3;}
p2^ := 2; {they are still accessible}
p3^ := 3;