[DUG] Sizeof record gives error

Rohit Gupta r.gupta at xtra.co.nz
Fri Aug 26 10:28:00 NZST 2011


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 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 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20110826/e0e4819f/attachment.html 


More information about the Delphi mailing list