David,
It looks like a compiler bug to me. Its treating the array as size 0.
My suggestion is to use a class/Tobject instead of record.
Rohit
On 25/08/2011 11:40 a.m., David Moorhouse (DUG) wrote:
I have the following code snippet
<code>
type
PConstArray = ^TConstArray;
TConstArray = array of TVarRec;
function CreateConstArray(const Elements: array of const): TConstArray;
type
TLogType = (ltError, ltWarn, ltInfo);
PLogData = ^TLogData;
TLogData = record
LogType: TLogType;
LogArgs: TConstArray;
end;
....
procedure TUserClass.Log(const LogType: TLogType; const Args: array of
const );
var
LogData: PLogData;
begin
// size of record TLogData does not work
GetMem(LogData, sizeof(TLogData));
LogData.LogType := LogType;
// blows up on next line
LogData.LogArgs := CreateConstArray(Args);
// ... do some other stuff with the LogData item finally calling FreeMem
end;
function CreateConstArray(const Elements: array of const): TConstArray;
var
I: Integer;
begin
SetLength(Result, Length(Elements));
for I := Low(Elements) to High(Elements) do
Result[I] := // assign a TVarRec here
end;
</code>
The code that assigns the memory only assigns 8 bytes - and an access
violation ensues. If I replace the call to "sizeof" with the number 16,
the code works fine.
My understanding of dynamic arrays was that the compiler created a 4 byte
field before the first element that contained the length of the array.
So why does the sizeof function not reflect this ? And why do I need 16
bytes not 12 (4 for LogType + 4 for length of array + 4 for array
pointer)?
Also regardless of the number of items in the open array parameter, 16
bytes works, so it does not relate the length of the TConstArray.
Your thoughts ?
David
_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: delphi@delphi.org.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-requ...@delphi.org.nz with Subject:
unsubscribe
__________ Information from ESET NOD32 Antivirus, version of virus signature
database 6407 (20110824) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
__________ Information from ESET NOD32 Antivirus, version of virus signature
database 6407 (20110824) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
--
Regards
*Rohit Gupta*
B.E. Elec., M.E., Mem IEEE, Member IET
Technical Manager
Computer Fanatics Ltd
*Tel *4892280
*Fax *4892290
*Web *www.cfl.co.nz
------------------------------------------------------------------------
This email and any attachments contain information, which is
confidential and may be subject to legal privilege and copyright. If you
are not the intended recipient, you must not use, distribute or copy
this email or attachments. If you have received this in error, please
notify us immediately by return email and then delete this email and any
attachments.
_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: delphi@delphi.org.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-requ...@delphi.org.nz with Subject:
unsubscribe