Free Pascal supports records. The prototype type definition of a record is:
Type RecType = Record Element1 : type1; Element2,Element3 : type2; ... Elementn ; Typen; end;Variant records are also supported:
Type RecType = Record Element1 : type1; Case [PivotElmt:] Type Identifier of Value1 : (VarElt1, Varelt2 : Vartype1); Value2 : (VarElt3, Varelt4 : Vartype2); end;The variant part must be last in the record. The optional PivotElmt can be used to see which variant is active at a certain time.
Remark: If you want to read a typed file with records, produced by a Turbo Pascal program, then chances are that you will not succeed in reading that file correctly.
The reason for this is that by default, elements of a record are aligned at 2-byte boundaries, for performance reasons. This default behaviour can be changed with the {$PackRecords n} switch. Possible values for n are 1, 2 and 4. This switch tells the compiler to align elements of a record or object or class on 1,2 or 4 byte boundaries.
Take a look at the following program:
Program PackRecordsDemo; type {$PackRecords 2} Trec1 = Record A : byte; B : Word; end; {$PACKRECORDS 1} Trec2 = Record A : Byte; B : Word; end; begin Writeln ('Size Trec1 : ',SizeOf(Trec1)); Writeln ('Size Trec2 : ',SizeOf(Trec2)); end.
The output of this program will be :
Size Trec1 : 4 Size Trec2 : 3And this is as expected. In Trec1, each of the elements A and B takes 2 bytes of memory, and in Trec1, A takes only 1 byte of memory.
Remark: As from version 0.9.3 (a developers' version), Free Pascal supports also the 'packed record', this is a record where all the elements are byte-aligned.
Thus the two following declarations are equivalent:
{$PACKRECORDS 1} Trec2 = Record A : Byte; B : Word; end; {$PACKRECORDS 2}and
Trec2 = Packed Record A : Byte; B : Word; end;Note the {$PACKRECORDS 2} after the first declaration !