Sign in Join
Wiki copytemporary

Array

Bahasa Indonesia · Deutsch · English · Español · Français · Suomi · Русский · 中文(中国) · 日本語

An array is a linear data structure concept that groups elements of the same type, stores them in contiguous and adjacent memory locations and provides random access to all of said elements (also known as components) by way of a linear index.

The word array is a reserved word. It always occurs in conjunction with the word of.

Notion

An array is a limited and arranged aggregation of elements, all having the same data type which is called the “base type.” It has at least one discrete, bounded dimension and continuously enumerates all of its elements. Each element can be uniquely identified by one or more scalar values, called indices , along those dimensions.

A one-dimensional array resembles an n-tuple , as it is known in mathematics, but has the constraint of being homogenous (all elements must be of the same type). The range of all possible values such an array can acquire is the homogenous n-ary Cartesian product of the base type.

A two-dimensional array resembles the mathematical concept of a matrix , except for the homogeneity restriction.

Usage

Length

Originally, Pascal only provided arrays of fixed length (Standard Pascal), meaning the number of elements an array consisted of had to be known at compile-time. Since this turned out to be a major constraint, and changes in computer hardware since then justified a step forward, variable-length arrays were introduced.

Extended Pascal defined the notion of “schemata” for this. Delphi introduced “dynamic arrays”. As of 2020, FPC only supports the latter regarding variable-length arrays, while support for “schemata” is planned.

Depending on whether an array is intended of being capable of changing its size, its definition varies, but just marginally. For a one-dimensional static array, the type definition looks like this:

pascal
array[indexType] of baseType

A dynamic array type definition is simply relieved of its dimension specification:

pascal
array of baseType

Static arrays

In static arrays, the ranges of all dimensions are known in advance. All dimension specifications have to be ordinal types. The following code shows some valid array definitions, all of them static.

pascal
program staticArrayDemo(input, output, stderr);
    
    type
        // specifying ordinal types as index directly
        
        /// allows selection of a character
        /// based on a Boolean value
        characterChoice = array[boolean] of UCS4char;
        
        // enumerations
        
        /// enumerates Cartesian axes
        spaceAxis = (xAxis, yAxis, zAxis);
        /// a point in three-dimensional Euclidean space
        locus = array[spaceAxis] of valReal;
        /// a point in a two-dimensional Euclidean plane
        point = array[xAxis..yAxis] of valReal;
        
        // integer subranges
        
        level = array[-24..24] of longint;
        box = array[-1..1, -1..1, -1..1] of boolean;
        transformationMatrix = array[0..1, 0..1] of valReal;
    begin
    end.

As all of an array’s elements have to be addressable, there exists a maximum limit of elements an array can hold. The sizeOf every array type has to be less than ptrInt’s maximum value.

Initialization

It's possible to set the initial values of a static (and dynamic) array's elements when it is declared –

pascal
var
        SArray : array[0..2] of integer = (1,2,3);            // A static Array
        CArray : array[0..1] of TColor = (clRed, clBlue);     // A static Array

See more: Topic: How to initialize the array (Free Pascal Lazarus Forum)

Addressing elements

An array’s element is addressed by naming the array variable’s identifier, followed by a valid index value enclosed by square brackets.

pascal
program arrayAddressDemo(input, output, stderr);
    var
        msg: array[0..2] of char;
    begin
        msg[0] := 'H';
        msg[1] := 'i';
        msg[2] := '!';
        writeLn(msg);
    end.

Multidimensional arrays’ elements can be addressed in two ways: either by comma-separated indices…

pascal
arrayVariable[firstDimensionIndex, secondDimensionIndex, thirdDimensionIndex]

…or by putting indices in dedicated square brackets.

pascal
arrayVariable[firstDimensionIndex][secondDimensionIndex][thirdDimensionIndex]

A third syntactically-valid option would be mixing both styles, however that is considered poor style, unless perhaps there is indication to group indices (e.g. x, y and z coordinates versus other indices) it is okay. Nonetheless, only the first mentioned notation is valid while defining array types.

Note, it is very important to specify indices in the defined order, within each dimensions’ range. Consider the following program; it will compile, but fail during run-time due to {$rangeChecks on}:

pascal
program arrayAddressOrderDemo(input, output, stderr);
    {$rangeChecks on}
    var
        i: integer;
        f: array[0..1, 0..3] of boolean;
    begin
        for i := 0 to 7 do
        begin
            f[0, i] := true;
        end;
    end.

While the program would indeed iterate over every array’s elements, it doesn’t do so in the intended way, but rather exploits the fact that the array’s internal memory structure is just a continuous block of memory. This is bad style. A programmer working with a high-level language is not supposed to care about specific memory layouts. Cave: It is possible to tamper with other variables in this way. At any rate, a run-time error, namely “RTE 216 general protection fault,” will occur if an attempt is made to access memory which is not within the purview of the process owner.

When values contained in arrays are merely read (and thus the indices do not matter), a for … in loop can be used.

Dynamic arrays

A dynamic array is an approach for overcoming the limitation of knowing the sizes of all dimensions in advance. See its dedicated page for more details.

Application

See, for instance:

In the default RTL’s system unit, the function system.slice returns the initial part of an array, similar to the Ruby notation arrayVariable[0, n]. Furthermore, there is system.arrayStringToPPchar. Most statistical routines of the RTL’s math unit accept arrays as parameters, as well as some other routines.

See also

navigation bar: data types simple data types boolean byte cardinal char currency double dword extended int8 int16 int32 int64 integer longint real shortint single smallint pointer qword word
complex data types array class object record set string shortstring


From the Free Pascal wiki, page "Array", as the Internet Archive kept it on 2026-01-21, last changed on 2024-11-03. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.