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

Reply via email to