community.borland.com

Article #15428: Declaring an array on the heap

 Technical Information Database

TI428D.txt - Declaring an array on the heap

Category   :Object Pascal
Platform   :All-32Bit
Product    :

Description:

  The following program, HEAPARY.PAS, demonstrates
  how to place an array on the heap. Programmers
  need to do this when they get errors saying that
  there are "too many variables" or that they are out
  of data space.

  The solution to the above errors is simply to
  move an array up on the heap by creating a pointer
  to the array. Notice that the actual definition of
  the array is in the TYPE section, not the VAR
  section. If you write a statement like:

  var MyArray: array[0..100] of Char

  then you are allocating memory in the data segment,
  which is what you want to avoid. The solution is to
  define the array in the TYPE section, and then
  declare it in the VAR section:

  var MyArray: PMyArray;

  where PMyArray is a pointer to an array. To see the complete
  code for this type of example, refer to the HEAPARY program
  shown below.

  The $X is just so HEAPARY.PAS can use ReadKey
  without returning a result, the FlushKeyBuffer and Pause
  methods are thrown in case you are interested. The body
  of the program and the Type declaration are the parts
  you want to look at. Always remember to dispose memory
  allocated with New!

Program HeapAry;

{$X+}
Uses
  Dos,
  Crt;

Type
  PMyArray = ^TMyArray;
  TMyArray = array[0..999] of LongInt;


procedure FlushKeyBuffer;
var Recpack : registers;
begin
  with recpack do begin
    Ax := ($0c shl 8) or 6;
    Dx := $00ff;
  end;
  Intr($21,recpack);
end;

procedure Pause;
begin
  FlushKeyBuffer;             { Make sure key buffer is empty!  }
  ReadKey;                    { Pause                           }
end;

var
  MyAry: PMyArray;
  i: Integer;

begin
  ClrScr;
  New(MyAry);                 { Allocate the memory on the heap }
  for i := 0 to 999 do        { Fill out array                  }
    MyAry^[i] := i;
  for i := 500 to 510 do      { Write the array to the screen   }
    WriteLn(MyAry^[i]);
  Pause;
  Dispose(MyAry);             { Dispose memory!                 }
end.


Reference:
 

4/22/99 1:01:59 PM
 

Last Modified: 01-SEP-99