On Thu, 10 Aug 2023, Hairy Pixels via fpc-pascal wrote:



On Aug 10, 2023, at 4:23 PM, Hairy Pixels <generic...@gmail.com> wrote:

// 4) subscript (inc and dereference in one step)
v := i[1];


#4 was not  in the list for example so I wonder what others exist.

I found another one in the typinfo.pp unit. What does,

1) taking the address of a type (@TAlignCheck) yield and
2) what does dereferencing nil yield?

Both I've never seen before until now.

type
TAlignCheck = record
  b : byte;
  w : word;
end;
var
p: pointer;
begin
p := @TAlignCheck(nil^).w;
end;

This is a very dirty trick to get the offset of a field in a record.

Note that you're not dereferencing a type but a variable of type TAlignCheck 
located
at memory address zero. The address of w (this is what the expression is
doing) is then the offset of w in the record.

It's probably more clear if you write it as
 p := @(TAlignCheck(nil^).w);

Michael.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to