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





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