[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