pascal - OpenVMS Pascal 常量用作大小初始值设定项时不是常量

标签 pascal openvms

我认为展示问题的最简单方法是举个例子。编码:

PROGRAM CONSTANTSTRING(OUTPUT);

CONST
    C_MaxLength = 30;

VAR
    small_string : VARYING[5] OF CHAR VALUE 'alpha';

PROCEDURE LocalProc(
    localstring : VARYING[C_MaxLength] of CHAR
);
BEGIN
    writeln('localstring length: ', localstring.LENGTH);
    writeln('localstring size: ', SIZE(localstring.BODY));
    writeln('C_MaxLength: ', C_MaxLength);
END;

BEGIN
    writeln('small_string length: ', small_string.LENGTH);
    writeln('small_string size: ', SIZE(small_string.BODY));
    writeln('C_MaxLength: ', C_MaxLength);

    LocalProc(small_string);
END.

编译:
>pascal /version
HP Pascal I64 V6.1-116 on OpenVMS I64 V8.4
>pascal constantstringinit
>link constantstringinit
>run constantstringinit

和输出:
small_string length:          5
small_string size:          5
C_MaxLength:         30
localstring length:          5
localstring size:          5
C_MaxLength:          5

如您所见 C_MaxLength 的值已在 LocalProc 内局部更改程序。这很奇怪,因为它已被声明为常量。

常量的新值只在LocalProc的范围内程序。调用 LocalProc 后在 main 中运行的代码将使用常量的原始值。

起初,这对我来说看起来像是一个编译器错误,但我认为这个编译器已经存在了足够长的时间,以至于可以检测到并修复或记录这样的事情。但是,我找不到有关此事的任何文件。这无济于事 VARYING是 HP 扩展,这意味着我无法与其他 Pascal 实现进行比较。

有没有大师更了解这里发生的事情?

最佳答案

已经很长时间了,我找不到支持它的文档,但我认为这是使用 varying[] of char 的特例。作为参数的类型:

    localstring : VARYING[C_MaxLength] of CHAR

这不仅声明了参数 localstring还有一个局部作用域的常量,它接收传入的实际字符串的大小。这只是因为你将它命名为与全局常量相同的名称,从而导致了混淆。您实际上并没有更改值 C_MaxLength .相反,您还有另一个 C_MaxLength在本地范围内。

尝试将该行更改为:
    localstring : VARYING[foo] of CHAR

然后检查 foo以及 C_MaxLength .我希望你会看到 foo是 5 和 C_MaxLength剩余 30。

关于pascal - OpenVMS Pascal 常量用作大小初始值设定项时不是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702975/

相关文章:

pascal - Delphi 类型等价和类型相等语法

delphi - 从 inno setup 获取 exe 或 dll 的版本

alpha - OpenVMS Alpha 引导扇区恢复

c - 快速读取文件(stream_lf 格式)

openvms - 如何在 HP openVMS DCL 中启用区分大小写?

java - 在 OpenVMS 上创建线程转储

pascal - 了解联合类型

java - 不同语言的新行

delphi - 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

java - 更新 jar 中的 .class 文件会引发异常