Ryan Joseph via fpc-pascal <fpc-pascal@lists.freepascal.org> schrieb am
Fr., 3. Apr. 2020, 21:03:

>
>
> > On Apr 3, 2020, at 10:09 PM, Sven Barth <pascaldra...@googlemail.com>
> wrote:
> >
> > If your DoThis would be declared with a dynamic array parameter (e.G.
> "specialize TArray<Integer>") then you'd in fact have a temporary dynamic
> array constructed on the heap.
> >
> > Also I didn't say that dynamic arrays can't be constant, but that they
> only are so if declared in a const section.
> >
>
> can you post an example of a const dynamic array? I tried and it thinks
> it's a set so I can't assign to an open array.
>

It needs to be a typed constant:

const
  MyArray: array of LongInt = (1, 2, 3);

If the writable constants switch is off then this dynamic array won't be
writable either.


> Also that made me think, is it possible for an open array parameter to be
> written to if its source was a static array? You said it's a pointer so I
> wonder if it's possible to use them instead of passing a static array
> pointer with an additional parameter for the length.
>

Yes that is indeed the case though you'll have to declare the parameter as
var as otherwise the compiler will create a copy on the stack which will be
lost afterwards.

Also open array *always* start at index 0. So if you pass a static array
that's declared as 4..6 then your function will get an open array stsrting
at 0 with length 3 with the element at 0 being the element at 4 of the
static array.

And as a special functionality open arrays allow slicing. That is if you
have an open array parameter you can pass along parts of it to another open
array:

SomeFunc(MyArrayArg[3..High(MyArrayArg) - 3]);

This will also work correctly with var/out open array parameters.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to