Главная страница | назад





Article #16830: Resizing an array

 Question and Answer Database

FAQ1830D.txt   Resizing an array
Category   :Compiler
Platform    :All
Product    :All 32 bit  

Question:
How can I resize an array?

Answer:
You cannot resize a non-dynamic array in Pascal. You can create and
resize a dynamically created array. To do this, you must create the
dynamic array, turn range checking off, and access the array members
via a variable only, or you will recieve runtime and compile time
errors. Since you will access the array through a pointer variable,
you can dynamically resize the array by creating a new array in
memory, copy all the valid elements of the original array to the new
array, free the memory for the original array, and assign the new
array's pointer back to the original array pointer.

Example:

type
  TSomeArrayElement = integer;
  PSomeArray = ^TSomeArray;
  TSomeArray = array[0..0] of TSomeArrayElement;

procedure CreateArray(var TheArray : PSomeArray;
                      NumElements : longint);
begin
  GetMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure FreeArray(var TheArray : PSomeArray;
                    NumElements : longint);
begin
  FreeMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure ReSizeArray(var TheArray : PSomeArray;
                      OldNumElements : longint;
                      NewNumElements : longint);
var
  TheNewArray : PSomeArray;
begin
  GetMem(TheNewArray, sizeof(TSomeArrayElement) * NewNumElements);
  if NewNumElements > OldNumElements then
    Move(TheArray^,
         TheNewArray^,
         OldNumElements * sizeof(TSomeArrayElement)) else
    Move(TheArray^,
         TheNewArray^,
         NewNumElements * sizeof(TSomeArrayElement));
  FreeMem(TheArray, sizeof(TSomeArrayElement) * OldNumElements);
  TheArray := TheNewArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p : PSomeArray;
  i : integer;
begin
{$IFOPT R+}
  {$DEFINE CKRANGE}
  {$R-}
{$ENDIF}

  CreateArray(p, 200);
  for i := 0 to 199 do
    p^[i] := i;
  ResizeArray(p, 200, 400);
  for i := 0 to 399 do
    p^[i] := i;
  ResizeArray(p, 400, 50);
  for i := 0 to 49 do
    p^[i] := i;
  FreeArray(p, 50);

{$IFDEF CKRANGE}
  {$UNDEF CKRANGE}
  {$R+}
{$ENDIF}
end;

7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99