On 3-12-2010 17:26, Jürgen Hestermann wrote:
andrew.benn...@ns.sympatico.ca schrieb:
After using BlockRead to fill a 2D dynamic array, I get an access
violation on the very first reference. A 2D array with only one
dimension dynamic works OK.
What am I missing?
Maybe you blundered into the same trap as so many others who do not know
that dynamic arrays are *pointers* (to arrays). It is one of the sins
done by Borland to abandon the once strict logic that in Pascal the
syntax is always context independend. Now this is no longer the case
(i.e. for dynamic arrays).
in your example
STat = Array[0..W-1] Of Single ; { Static array }
DST = Array Of STat ; { One dimension dynamic, the other static }
D2T = Array Of Array Of Single ; { Two dynamic dimensions }
STat always means the address starting with STat[0] (context independend).
Also DST always means the address where DST[0].
Nope, there is a difference between DST and DST[0]. DST won't give you
the first element. You can try this youself with an untyped parameter:
procedure Foo(const AParam);
begin
WriteLN(Single(APAram));
end;
You will see a difference between passing DST or DST[0]
To be safe, for any N-dimension dynamic array always use [0,..,0] to
pass the first element. To avoid confusion, you can do this for static
arrays too.
But D2T is a pointer which can be either the the address of the pointer
(in all low level routines like fillchar, sizeof, BlockRead/-Write etc.)
but also can be the address of the D2T[0] because you can refer to
elements without the need to dereference it as in D2T^[0].
In behaviour DST and D2T wont differ.
Marc
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal