[fpc-pascal] A warning when Blockwriting/reading dynamic array pointers

Jürgen Hestermann juergen.hestermann at gmx.de
Sat Apr 2 19:19:43 CEST 2011


DaWorm schrieb:
 > IMO, a dynamic array should never be part of a structure that is
 > passed to BlockWrite in the first place.  Not that I use many dynamic
 > arrays in the first place, but to me they pass over the border between
 > simple data types (that are fine for BlockWrite) and managed data
 > types (that have quite a lot of "gotchas").  I lump them in with
 > TObjects in that respect.

The problem with all these "managed data types" is, that their internal 
structure and behaviour is not fully documented which makes it hard to 
judge whether and how to use them.

I created a recursive record structure to represent a directory branch 
(files and directories) on disk:

---------------------------------------------------------
type TreeListZType  = ^TreeListType;
     DirContentType = array of TreeListZTyp;
     TreeListType   = record
                      CreationTime,
                      LastAccessTime,
                      LastWriteTime : FileTime;
                      FileSizeHigh,
                      FileSizeLow : LongInt;
                      IsFile  : boolean;
                      DirContent : DirContentType;
                      Name  : AnsiString;
                      end; // of record
---------------------------------------------------------

When storing all the data I Blockwrite each record except the last 
AnsiString (which I handle extra). When reading it back from file the 
dynamic array pointer "DirContent" serves as an automatic boolean 
because it tells me, whether the array was empty (=nil) or not. When not 
empty, I have to read back the number of elements of the array, 
otherwise nothing has to be read. Before doing so, I have to clear the 
old pointer so that SetLength works correctly. The problem was, that it 
never came into my mind that assigning nil will do more than just 
assigning a value. I did this just to prepare the pointer for the later 
use with SetLength.




More information about the fpc-pascal mailing list