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