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

Reply via email to