On 05/12/2010 23:35, andrew.benn...@ns.sympatico.ca wrote:

J?rgen Hestermann<juergen.hesterm...@gmx.de>  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).

After wasting another 2 days reading the documentation, I returned to
blind experiment ...

I find that BlockRead(F, A[J,0], RightDim*Sizeof(Single), count) works where
BlockRead(F, A[J], RightDim*Sizeof(Single), count) does not.
That is, reading RightDim elements into a space the size of one element
is OK but reading them into a space of the correct size is not.

Personally, I would call that a BUG.
No, a feature.

I guess you assume that an array "a array of array of integer" is a continuous block in memory. But it is not

type TIntArray: array of integer;
var a1: TIntArray;

makes "a1" a *pointer* to a block of memory

var a2: array of TIntArray;

makes a2 a pointer to a list of pointers, each of them pointing to a further block of memory.

BlockRead(F, A[J], ....)
overwrites the pointers, pointing to the 2nd dimension arrays.

BTW, it actually is not just a pointer, but a refcounted pointer.
so after BlockRead(F, A[J], ....); not only do the pointer point to random 
location, the whole refcounting is messed up too.

Martin
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to