Difference between revisions of "@"
m (ordinal numbers in syntaxhighlight) |
(→read more: link system.addr) |
||
Line 30: | Line 30: | ||
* [https://www.freepascal.org/docs-html/ref/refse83.html The <syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight> operator] | * [https://www.freepascal.org/docs-html/ref/refse83.html The <syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight> operator] | ||
* [https://www.freepascal.org/docs-html/prog/progsu75.html Typed address operator (<syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight>)] | * [https://www.freepascal.org/docs-html/prog/progsu75.html Typed address operator (<syntaxhighlight lang="pascal" enclose="none">@</syntaxhighlight>)] | ||
+ | * {{Doc|package=RTL|unit=system|identifier=addr|text=<syntaxhighlight lang="pascal" enclose="none">system.addr</syntaxhighlight>}} | ||
{{Symbols}} | {{Symbols}} |
Revision as of 03:37, 12 November 2018
│
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
The address operator @
returns the address of a variable, procedure or function.
Normally, the value @
returns is an untyped pointer
.
If you are handling pointers a lot, and want to mitigate issues with passing references of wrong type's target, you have use the directive {$typedaddress on}
.
Here some example to demonstrate, what produces with untyped pointers valid and functional code, but semantically outputs an erroneous result:
1program untypedAddressDemo(input, output, stderr);
2
3procedure incrementIntByRef(const ref: PByte);
4begin
5 inc(ref^);
6end;
7
8var
9 foo: integer;
10begin
11 foo := -1;
12 incrementIntByRef(@foo);
13 writeLn(foo);
14end.
It was intended, that 0
(zero) gets printed, but the program prints -256
instead.
With {$typedaddress on}
compilation fails with an incompatible type error.
You usually want the latter behavior (compile-time failure) instead of wasting time with hours of debugging.
read more
single characters |
|
character pairs |
|