[DUG] Sizeof record gives error
David
delphi at 275a.com
Sat Sep 10 15:36:13 NZST 2011
Hi,
From my early delphi days, isn't there a setting for "aligned records"
in the compiler options that you need to uncheck?
David
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 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
>
> __________ Information from ESET Smart Security, version of virus signature database 6451 (20110909) __________
>
> The message was checked by ESET Smart Security.
>
> http://www.eset.com
>
>
>
>
More information about the Delphi
mailing list