opensubscriber
   Find in this group all groups
 
Unknown more information…

d : delphi@delphi.org.nz 25 August 2011 • 7:40AM -0400

[DUG] Sizeof record gives error
by David Moorhouse (DUG)

REPLY TO AUTHOR
 
REPLY TO GROUP




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@delp...
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-request@delp... with Subject: unsubscribe

Bookmark with:

Delicious   Digg   reddit   Facebook   StumbleUpon

Related Messages

opensubscriber is not affiliated with the authors of this message nor responsible for its content.