- - * - WhiteUnicorn - * - -




* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >


Frequently Asked Questions

Resizing an array

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;



* #WhiteUnicorn/ StartPage/ Documentation/DelphiFAQ >



- - * - Anastasija aka WhiteUnicorn - * - - LJLiveJournal
PFPhotoFile