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