Consider this program:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
procedure Foo;
begin
end;
type
TProcedure = procedure;
const
FooConst: TProcedure = Foo;
var
FooVar: TProcedure = Foo;
P: Pointer;
{$TYPEDADDRESS ON}
begin
P := @Foo;
Writeln(Format('%p', [P]));
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
Writeln(Format('%p', [@Foo]));
Readln;
end.
This program compiles and runs on XE3 and produces the following output:
00419FB8 00419FB8 00419FB8 00419FB8
On XE4 and later the program fails to compile, with error messages on both of these lines:
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
[dcc32 Error] E2250 There is no overloaded version of 'Format' that can be called with these arguments
On XE4, XE5 and XE6, the program compiles when $TYPEDADDRESS
is switched off. On XE7, the program fails to compile irrespective of the setting of $TYPEDADDRESS
.
Is this a compiler bug? Or am I using incorrect syntax to obtain the address of a procedure?
Cisco is embracing NETCONF/RESTCONF/gRPC interfaces and YANG data models to make automation and management simpler.
QoS classifies traffic by assigning priority-indexed 802.1p class of service (CoS) values to frames at ingress ports. If traffic is tagged with a CoS value at the ingress port, the switch forwards the value. If traffic is native, then the switch can rewrite the CoS tag.
Using quality of service (QoS) on Cisco network devices helps. provide both bandwidth and priority to certain types of network traffic. The. network administrator tells the network devices which traffic requires what. bandwidth and priority.
I believe that this is a compiler bug and have submitted a QC report: QC#127814.
As a work around you can use either of the following:
addr()
rather than the @
operator.@FooVar
or @FooConst
to Pointer
, e.g. Pointer(@FooVar)
.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With