[DUG] Sizeof record gives error
Colin Johnsun
colin.adug at gmail.com
Thu Aug 25 11:48:57 NZST 2011
Haven't got into the details of your problem, but here is an article
which goes into the details
of array of const.
http://rvelthuis.de/articles/articles-openarr.html
Hope it helps,
Cheers,
Colin
On 25 August 2011 09:40, David Moorhouse (DUG) <delphi at moorhouse.net.nz> 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 at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>
More information about the Delphi
mailing list