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

Reply via email to