{#################################################}
{# File: Arrays.Pas #}
{# Author: Darryl Lovato. #}
{# Description: #}
{# This module provides a set of routines to #}
{# create & use large arrays #}
{#################################################}
unit Arrays;
interface
uses MacIntf;
function CreateNewArray(elemSize, upperBound : Longint) : Handle;
procedure DisposeArray(ary : Handle);
procedure SetElement(ary : Handle; elemNum : Longint; elemPtr : Ptr);
function GetElement(ary : Handle; elemNum : Longint) : Ptr;
implementation
ArrayHdl = ^ArrayPtr;
ArrayPtr = ^ArrayRec;
ArrayRec = record
hiBound : integer;
cellSize : Longint;
dataStuff : integer;
end;
{#################################################}
{# #}
{# function CreateNewArray(elemSize, lowerBound, #}
{# upperBound : Longint) : Handle; #}
{# #}
{#################################################}
function CreateNewArray(elemSize, upperBound : Longint) : Handle;
var
tempHdl : ArrayHdl;
begin
tempHdl := ArrayHdl(NewHandle(Ord4(SizeOf(ArrayRec)) - 2
+ ((upperbound + 1) * elemSize)));
with tempHdl^^ do
begin
hiBound := upperBound;
cellSize := elemSize;
end;
CreateNewArray := Handle(tempHdl);
end;
{#################################################}
{# #}
{# procedure DisposeArray(ary : Handle); #}
{# #}
{# #}
{#################################################}
procedure DisposeArray(ary : Handle);
begin
DisposHandle(ary);
end;
{#################################################}
{# #}
{# #}
{# procedure SetElement(ary : Handle; elemNum : #}
{# Longint; elemPtr : Ptr); #}
{# #}
{# #}
{#################################################}
procedure SetElement(ary : Handle; elemNum : Longint; elemPtr : Ptr);
fakeary = packed array[1..10000] of signedbyte;
fakeptr = ^fakeary;
var
cellAddr : fakePtr;
i : integer;
begin
with ArrayHdl(ary)^^ do
if (elemNum > 0) and (elemNum < hibound) then
begin
cellAddr := fakePtr(Ord4(@dataStuff) + (elemNum *
cellSize));
for i := 0 to cellSize - 1 do
cellAddr^[i] := fakePtr(elemPtr)^[i];
end;
end;
{#################################################}
{# #}
{# #}
{# procedure GetElement(ary : Handle; elemNum : #}
{# Longint) : Ptr); #}
{# #}
{# #}
{#################################################}
function GetElement(ary : Handle; elemNum : Longint) : Ptr;
begin
with ArrayHdl(ary)^^ do
if (elemNum > 0) and (elemNum < hibound) then
GetElement := Pointer(Ord4(@dataStuff) + (elemNum *
cellSize));
end;
end.
{#################################################}
{# #}
{# This program tests the Array Package #}
{# #}
{# #}
{#################################################}
program AryTest(input, output);
uses Macintf, Arrays;
BigPtr = ^BigRec;
BigRec = record
r : real;
r2 : real;
other : array[1..20] of Longint;
end;
var
myArray : handle;
i : longint;
Big : BigRec;
x : integer;
StackMark : integer;
begin
SetApplLimit(Pointer(Ord4(@StackMark) - Ord4(16000))); {16k stack}
MaxApplZone;
myArray := CreateNewArray(SizeOf(BigRec), 2000);
writeln(‘Total Size of Record = ‘,SizeOf(BigRec));
writeln(‘Total Size of the array = ‘,GetHandleSize(myArray));
writeln;
writeln(‘press mouse to start’);
repeat until button;
for i := 0 to 2000 do
begin
Big.r := i / 1.0;
SetElement(myArray, i, @Big);
writeln(BigPtr(GetElement(myArray, i))^.r:7:2);
end;
DisposeArray(myArray);
end.