[fpc-pascal] Open vs dynamic arrays

Mark Morgan Lloyd markMLl.fpc-pascal at telemetry.co.uk
Sun Apr 22 12:54:21 CEST 2012

Michael Van Canneyt wrote:
> On Sun, 22 Apr 2012, Mark Morgan Lloyd wrote:
>> cobines wrote:
>>> 2012/4/22 Mark Morgan Lloyd <markMLl.fpc-pascal at telemetry.co.uk>:
>>>>  but I'm not sure why that works when it
>>>> didn't earlier (i.e. before I'd started using array of const).
>>> You said you used
>>> DbgArray= array of integer
>>> then I assume this declaration?
>>> procedure ClrDebug(const panels: DbgArray);
>>> If so the parameter is a dynamic array not open array and you cannot
>>> call it with constant array:
>>> var
>>>   arr: DbgArray;
>>> begin
>>>  ClrDebug([DbgKey, DbgCode1, DbgTx]); //Won't work
>>>  SetLength(arr, ...);
>>>  arr[0] := ...
>>>  ...
>>>  ClrDebug(arr);// This works
>>> end;
>>> This on the other hand is an open array parameter:
>>> procedure ClrDebug(const panels: array of integer);
>> Thanks, succinct. So if I understand this correctly it's one of the 
>> very rare cases where one has to write out the type of a parameter in 
>> full, rather than using an earlier declaration.
> It results in different declarations.
> type
>   DbgArray = array of integer;
> procedure ClrDebug(const panels: DbgArray);
> Defines a procedure that accepts a dynamic array of type DbgArray.
> You cannot have "constant dynamic arrays", as they are managed on the 
> heap and reference counted.
> On the other hand
> procedure ClrDebug(const panels: array of integer);
> Defines a procedure that accepts an open array: an array of integers, 
> but without length. It accepts types as
> type
>   SmallArray = array[1..100] of integer;
>   LargeArray = array[1..10000] of integer;
> And a constant array (and a dynamic array, if I'm correct) as well.
> I'll see if I can add something about it in the docs.

Hopefully Google will pick this up as a guide for the perplexed :-)

So if I understand things correctly, the important point here is that 
while it is good practice to do e.g.

type dbgArray3= array[0..2] of integer;

procedure clrDebug3(da: dbgArray3);

rather than

procedure clrDebug3(da: array[0..2] of integer);

you quite simply can't do that when there isn't an explicit index range 
since your attempt to define an open array is interpreted as a dynamic 

Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]

More information about the fpc-pascal mailing list