Am 04.04.2023 um 08:16 schrieb Jacob Kroon via fpc-pascal:
Thanks for the tip above.
I was able to write a couple of perl-scripts that are able to convert
my old Pascal sources to something that fpc can parse. Amongst other
things, the scripts inject the "public name"/"external name"
annotations so that the program can link.
But I suspect I have a new problem: With the old Pascal/MT+ compiler
it would appear that local variables declared in functions/procedures
have a life-time that spans the whole program, like a "static"
declared variable in C. With fpc, it looks like locally declared
variables are automatic, put on the stack(?), and so they go out of
existence once out of scope ?
IMO, this is not a feature of the old PASCAL compiler,
but instead your Pascal programs "by error" depends on the local variables
appearing at the same location on the stack at subsequent calls as before
(if there are no other calls at the same level in between).
The local variables are not initialized when allocated, and so it is
possible
that they still have the old value that they had when the same function
was left the last time. I know (from the 1970s and 1980s) that some
weird programs
used this effect. But as soon as another call was entered between the
two calls
of the procedure, the stack at this location was overwritten, and the
"clever" use
of the old value of the variable was not possible any more. And: it
depends on the
stack being initialized to a known default value in the first time.
This said: the initial value of the local variables is UNDEFINED, and
this is true
for every Pascal compiler. I cannot imagine a compiler which doesn't
follow this basic rule.
So IMO: you should find the places in your program, where this weird
technique is used
and not blame the old compiler for this.
Some compilers have an option which initializes every automatic variable
on every allocation;
some compilers even allow the bit-pattern to be specified (for example:
0xff).
While this is a performance nightmare, this is very good to run the
program once during program test,
because it will show if your program depends on such effects or if it
produces different values,
depending on initialized or uninitialized local variables.
Kind regards
Bernd
The program depends on this feature in the old compiler. I did some
googling and found that putting local variables in a "const" section
instead of "var" would make them have a "whole-program" lifetime, but
then I need to provide them with an initial value.
Do I have any other option besides changing from "var" to "const"
everywhere, and provide initial values in all declarations ?
Regards
Jacob
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal