Category : Pascal Source Code
Archive   : VMMNGR.ZIP
Filename : EXDYNARR.PAS

 
Output of file : EXDYNARR.PAS contained in archive : VMMNGR.ZIP
program DynArrayExample;

uses
OpCrt,
OpRoot,
Vmmngr;

type
ExpRecord
= record
Name : string[25];
Age,
Class: word;
end;
var
ExpArray : DynArray;
RecBuffer : ExpRecord; {buffer to put and get data to and from ExpArray}
Key,
Status,
NbElem,
NumIncr : word;
S : DosIdStream;

procedure ShowStatus;
{-Display status of ExpArray}
begin
Writeln('ExpArray size is now : ', ExpArray.GetArraySize);
Writeln('ExpArray status is : ', ExpArray.GetStatus);
end;

procedure ShowContents(index : word);
{-Show contents of one element of ExpArray}
begin
ExpArray.GetElem(index, RecBuffer);
Writeln('Element #',index, ' Name is : ', RecBuffer.Name);
Writeln('Element #',index, ' Age is : ', RecBuffer.Age);
Writeln('Element #',index, ' Class is : ', RecBuffer.Class);
end;

begin
Write('Enter the maximum number of elements for the array : ');
ReadLn(NbElem);
Write('Enter the minimum increment when growing (number of elements) : ');
ReadLn(NumIncr);
ClrScr;
{Creates a dynamic array of ExpRecord}
if not ExpArray.Init(NbElem,
SizeOf(ExpRecord),
NumIncr) then begin
WriteLn('Failed to Create DynArray, Status = ', InitStatus);
Halt;
end;
Writeln('After initialization, the array size is 0...');
ShowStatus;

{Load RecBuffer}
Recbuffer.Name := 'Name0';
Recbuffer.Age := 0; {Not realistic but helps seeing how things work}
RecBuffer.Class := 0;

{Store RecBuffer in the dynamic array}
ExpArray.SetElem(0, RecBuffer);

{Size increase to the minimum increment}
Writeln('Setting the first element will increase the size to the minimum increment...');
Writeln('One element occupies ', ExpArray.GetElemSize, ' bytes');
ShowStatus;
ShowContents(0);

{Load another value at maximum index }
Recbuffer.Name := 'NameMax';
Recbuffer.Age := ExpArray.GetMaxIndex;
RecBuffer.Class := Recbuffer.Age;
ExpArray.SetElem(ExpArray.GetMaxIndex, RecBuffer);

{The size was increased to receive the last element}
Writeln('Setting the last element will likely require a size increase...');
ShowStatus;
ShowContents(ExpArray.GetMaxIndex);

{Elements non explicitly set are always 0}
Writeln('You can always assume that an element which has not been set is null...');
ShowContents(ExpArray.GetMaxIndex-1);
Writeln('Press any key');
While not KeyPressed do;
While Keypressed do Key :=ReadKeyWord;
ClrScr;

{Now storing the array in a stream, killing it and reloading it}
Writeln('Now storing the array...');
{Create a Stream, check for success}
if not S.Init('DYNARRAY.STM', SCreate) then begin
Writeln('Failed to Create Stream, Status = ', InitStatus);
Halt;
end;
{Register object hierarchy}
S.RegisterHier(DynArrayStream);
Status := S.GetStatus;
if Status <> 0 then begin
Writeln('Failed to Register objects, Status = ', Status);
Halt;
end;
S.Put(ExpArray);
Status := S.GetStatus;
if Status <> 0 then begin
WriteLn('Failed to Write ExpArray, Status = ', Status);
Halt;
end;

Writeln('Now killing ExpArray...');
ExpArray.Done;
S.done;

Writeln('Now reloading ExpArray...');
{Re-open the existing Stream}
if not S.Init('DYNARRAY.STM', SOpen) then begin
Writeln('Failed to Open Stream, Status = ', InitStatus);
Halt;
end;
{Re-register object hierarchy}
S.RegisterHier(DynArrayStream);
Status := S.GetStatus;
if Status <> 0 then begin
Writeln('Failed to register objects. Status = ', Status);
Halt;
end;
S.Get(ExpArray);
Status := S.GetStatus;
if Status <> 0 then begin
Writeln ('Failed to read ExpArray. Status = ', Status);
Halt;
end;
S.Done;
Writeln('Showing ExpArray first and last elements...');
ShowStatus;
ShowContents(ExpArray.GetMaxIndex);
ShowContents(0);
Writeln;
Writeln('Press any key');
While not KeyPressed do;
While Keypressed do Key :=ReadKeyWord;
ClrScr;

{Clearing the array just resets the size to 0 and free all data on the heap}
{However the array is still active and any element could be set}
Writeln('Now clearing the array...');
ExpArray.Clear;
Writeln('ExpArray size is now ', ExpArray.GetArraySize, ' bytes');
Writeln('ExpArray still alive : any element can be set.');

Writeln('Now testing error checking...');
Writeln('Trying to get the second element of the cleared array...');
ExpArray.GetElem(2, RecBuffer);
if ExpArray.GetStatus <> 0 then
Writeln('Failed to retrieve element data');
Writeln;
Writeln('Now trying to setup a very big array (30000 elements)...');
ExpArray.Done;
ExpArray.Init(30000, SizeOf(ExpRecord), 100);
if InitStatus <> 0 then
WriteLn('Failed to Create DynArray, Status = ', InitStatus);

ExpArray.done;
end.


  3 Responses to “Category : Pascal Source Code
Archive   : VMMNGR.ZIP
Filename : EXDYNARR.PAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/