| Arrays
An array represents an indexed
collection of elements of the same type (called the base type).
Because each element has a unique index, arrays, unlike sets, can
meaningfully contain the same value more than once. Arrays can be
allocated statically or dynamically.
Static arrays
There're called like this because
the size of the arrays can't be modified at run time. It's like
constants except here instead of data's… the size of the
arrays can't be modified.
array[indexType1, ...,
indexTypen] of baseType
where each indexType is an ordinal
type whose range does not exceed 2GB. Since the indexTypes index
the array, the number of elements an array can hold is limited by
the product of the sizes of the indexTypes. In practice, indexTypes
are usually integer subranges.
In the simplest case of a one-dimensional array, there is only a
single indexType. For example,
var MyArray: array[1..100] of
Char;
declares a variable called MyArray
that holds an array of 100 character values. Given this
declaration, MyArray[3] denotes the third character in MyArray. If
you create a static array but don't assign values to all its
elements, the unused elements are still allocated and contain
random data; they are like uninitialized variables.
A multidimensional array is an array of arrays. For
example,
type TMatrix = array[1..10] of
array[1..50] of Real;
is equivalent to
type TMatrix = array[1..10,
1..50] of Real;
Whichever way TMatrix is declared,
it represents an array of 500 real values. A variable MyMatrix of
type TMatrix can be indexed like this: MyMatrix[2,45]; or like
this: MyMatrix[2][45].
The standard functions Low and High
operate on array type identifiers and variables. They return the
low and high bounds of the array's first index type. The standard
function Length returns the number of elements in the array's first
dimension.
Dynamic arrays
Dynamic arrays do not have a fixed
size or length. Instead, memory for a dynamic array is reallocated
when you assign a value to the array or pass it to the SetLength
procedure. Dynamic-array types are denoted by constructions of the
form
array of baseType
For example,
var MyFlexibleArray: array of
Real;
declares a one-dimensional dynamic
array of reals. The declaration does not allocate memory for
MyFlexibleArray. To create the array in memory, call SetLength. For
example, given the declaration above,
SetLength(MyFlexibleArray,
20);
allocates an array of 20 reals,
indexed 0 to 19. Dynamic arrays are always integer-indexed, always
starting from 0.
Dynamic-array variables are implicitly pointers and are managed by
the same reference-counting technique used for long strings. To
deallocate a dynamic array, assign nil to a variable that
references the array or pass the variable to Finalize; either of
these methods disposes of the array, provided there are no other
references to it. Dynamic arrays of length 0 have the value nil. Do
not apply the dereference operator (^) to a dynamic-array variable
or pass it to the New or Dispose procedure.
If X and Y are variables of the same
dynamic-array type, X :=Y points X to the same array as Y. (There
is no need to allocate memory for X before performing this
operation.) Unlike strings and static arrays, dynamic arrays are
not automatically copied before they are written to. For example,
after this code executes-
var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;
-the value of A[0] is 2. (If A and B
were static arrays, A[0] would still be 1.)
Assigning to a dynamic-array index (for example,
MyFlexibleArray[2] := 7) does not reallocate the array.
Out-of-range indexes are not reported at compile time.
When dynamic-array variables are compared, their references are
compared, not their array values. Thus, after execution of the
code
var
A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;
A = B returns False but A[0] = B[0]
returns True.
To truncate a dynamic array, pass it to the Copy function and
assign the result back to the array variable. For example, if A is
a dynamic array, A := Copy(A, 0, 20) truncates all but the first 20
elements of A.
Once a dynamic array has been allocated, you can pass it to the
standard functions Length, High, and Low. Length returns the number
of elements in the array, High returns the array's highest index
(that is, Length - 1), and Low returns 0. In the case of a
zero-length array, High returns -1 (with the anomalous consequence
that High < Low).
Note: In some function and procedure
declarations, array parameters are represented as array of
baseType, without any index types specified. For
example,
function CheckStrings(A: array of
string): Boolean;
This indicates that the function
operates on all arrays of the specified base type, regardless of
their size, how they are indexed, or whether they are allocated
statically or dynamically
|