[fpc-devel]Bugs in setlength for multidimensional dynamic arrays: first partial fix

Michael Van Canneyt michael.vancanneyt at wisa.be
Mon Sep 24 13:56:44 CEST 2001


On Mon, 24 Sep 2001, Jonas Maebe wrote:

>
> On woensdag, september 12, 2001, at 10:00 , Pavel V. Ozerski wrote:
>
> > I tried to find causes of buggy behavior of the last 1.1 compiler if it
> > tries to compile source with
> > multidimensional dynamic arrays. The problem is not fully fixed but at
> > least after my fix compiler does not
> > reject SetLength with more than two parameters (but it works
> > incorrectly then). My solution seems to be not a hack
> > but a typical bugfix.
>
> You're correct, I've applied your fix. It seems however that before
> multiple dimensions are supported properly for dynamical arrays, a lot
> of things stil have to be changed in the compiler :( Currently, if you
> declare
>
> var
>    a: array of longint;
>
>
> then a[<some index>] has always longint as return type.

It should have. What else should it have ?

If you want to declare a multidimensional array, you should declare it
explicitly as

a : array of array of longint;

See the delphi manual (Multidimensional dynamic arrays)

a : array of longint

is always a one-dimensional array.

> This means that
> a[1,1] won't be accepted, and high(a[1]) returns maxlongint.

This is correct and as it should be.


> I don't
> really know how to fix this cleanly in the compiler, since in some cases
> you need "array of longint" as result type when using a[0], and in other
> cases you need "longint".

That is wrong;
Assuming the original declaration of a, a[1] is ALWAYS of type longint.

One issue is that, assuming the declaration

a : array of array of longint;

The following are valid calls to setlength:

Setlength(A,10,20)  (10 arrays of each 20 longints)
Setlength(A,10);    (10 unallocated arrays of longint)
Setlength(A[10],20) (set length of 10th array to 20)

Michael.







More information about the fpc-devel mailing list