[fpc-pascal] dynamic arrays behaving funny
Marc Santhoff
M.Santhoff at t-online.de
Wed Nov 12 21:53:22 CET 2008
Hi,
I'm trying to assing dynamic array variables to a record type on the
heap and handing that record over to the caller:
type
TCompoundInfo = record
Id: hid_t;
Name: string;
TotalSize: longword;
ElementNames: array of PChar;
ElementSizes: array of longword;
ElementTypes: HidTArray;
ElementOffsets: array of longword;
end;
PTableInfo = ^TTableInfo;
TTableInfo = TCompoundInfo;
TBaseCompoundDescriptor = class
private
fItemName: string;
fTotalTypeSize: longword;
fFieldCount: integer;
fFieldNames: array of PChar;
fFieldSizes: array of longword;
fFieldOffsets: array of longword;
fFieldTypes: HidtArray;
TTableDescriptor = class(TBaseCompoundDescriptor)
...
...
constructor TTableDescriptor.create;
begin
inherited create;
GetMem(fInfo, sizeof(TTableInfo));
...
function TTableDescriptor.GetInfo: PTableInfo;
begin
with fInfo^ do begin
Name := fItemName;
TotalSize := fTotalTypeSize;
ElementNames := fFieldNames;
the last line trying to assign a (already sized and holding information)
dynamic array to a similar variable fails:
Program received signal SIGSEGV, Segmentation fault.
0x8051eb5 in fpc_dynarray_decr_ref ()
(gdb) bt
#0 0x8051eb5 in fpc_dynarray_decr_ref ()
#1 0x80a2b26 in TTABLEDESCRIPTOR__GETINFO (this=0x283981e8) at CompoundTypes.pas:398
#2 0x80624e3 in TDS_HDF__INIT (C=0x80a8fc4, this=0x283c8028) at DS_HDF.pp:210
#3 0x8064fd1 in TDATACONVERTER__CONVERT (this=0x283b0248) at DataConverter.pp:191
#4 0x8049425 in main () at DC.pas:156
The ref guide says when assigning one dyn-array to another variable of
the same type, this is done by reference and those arrays are
ref-counted.
Why does it fail?
I tried using SetLength on the target var first, same error.
TIA,
Marc
More information about the fpc-pascal
mailing list