<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    David,&nbsp; <br>
    <br>
    It looks like a compiler bug to me.&nbsp; Its treating the array as size
    0.<br>
    <br>
    My suggestion is to use a class/Tobject instead of record.<br>
    <br>
    Rohit<br>
    <br>
    On 25/08/2011 11:40 a.m., David Moorhouse (DUG) wrote:
    <blockquote
cite="mid:dae96492456671290f17a8fc16ec648c.squirrel@mail.moorhouse.net.nz"
      type="cite">
      <pre wrap="">I have the following code snippet

&lt;code&gt;
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;
&lt;/code&gt;

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: <a class="moz-txt-link-abbreviated" href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>
Admin: <a class="moz-txt-link-freetext" href="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</a>
Unsubscribe: send an email to <a class="moz-txt-link-abbreviated" href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe

__________ Information from ESET NOD32 Antivirus, version of virus signature database 6407 (20110824) __________

The message was checked by ESET NOD32 Antivirus.

<a class="moz-txt-link-freetext" href="http://www.eset.com">http://www.eset.com</a>


__________ Information from ESET NOD32 Antivirus, version of virus signature database 6407 (20110824) __________

The message was checked by ESET NOD32 Antivirus.

<a class="moz-txt-link-freetext" href="http://www.eset.com">http://www.eset.com</a>




</pre>
    </blockquote>
    <br>
    <br>
    <div class="moz-signature">-- <br>
      Regards<br>
      <br>
      <b>Rohit Gupta</b><br>
      B.E. Elec., M.E., Mem IEEE, Member IET<br>
      Technical Manager<br>
      Computer Fanatics Ltd<br>
      <br>
      <b>Tel </b>4892280 <br>
      <b>Fax </b>4892290 <br>
      <b>Web </b><a href="www.cfl.co.nz">www.cfl.co.nz</a><br>
      <hr>
      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.</div>
  </body>
</html>