[DUG] Sizeof record gives error
David Moorhouse (DUG)
delphi at moorhouse.net.nz
Thu Aug 25 12:02:19 NZST 2011
Thanks Colin
The TVarRec and open array stuff come from Rudy's page - very helpful too :)
D
> 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
>>
>
> _______________________________________________
> 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