Jürgen Hestermann wrote:
> Paul Nicholls schrieb:
I also find writable constants hand for things like this where I can
define the 'variable' + values too so I don't have to set the values
at run time:
But can't you do the same with a variable declaration? If you want to
change the value at runtime it's definitely not a constant anymore.
Not always
Beeing able to change a typed constant was added by Borland as a
"quick hack" (because constants were put into the global data segement
even in function declarations) but actually its semantic is wrong. If
you can change it, it has to be a variable declaration and you should
not be able to change a constant.
there is an important difference between
const a: word = 1;
const a = word(1); // never writeable
var a: word = 1;
The1 1st and 3rd are (afaik) the same, if used top level, that is in the
global context of interface, or implementation
.
But if
procedure Foo;
const a: word = 1;
var a: word = 1;
begin
end;
Then they are 2 difference things.
The "var" version, acts as if your first statement in the procedure was
"a:= 1;". It initializes the variable each time you enter the function.
If you enter the function recursively, then each level, has it's own a,
not touching the value of the callers a
The const version act like a global variable. It is set to 1 once at
some time before the 1st call to Foo. It will not be initialized again.
If Foo chages it, it will keep the changed value, even between calls to
Foo. If Foo enters recursively, it act like a global var, there is only
one a, shared by all calls to Foo.
If Foo is a Method on an object, then it is shared between all instances
of the object.
The only difference to a global var is, that no one outside Foo can see
or access it.
And you can't do that with an initialized var. And there are plenty of
use-cases for it.
Martin
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal