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

OpenVMS Pascal常量用作大小初始值设定项时不是常量,pascal,openvms,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 le

我认为证明这个问题最简单的方法就是举个例子。守则:

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中运行的代码将使用常量的原始值

起初,我觉得这像是一个编译器错误,但我认为这个编译器已经存在了足够长的时间,这样的东西可能会被检测到,或者被修复,或者被记录下来。但是,我找不到关于这件事的任何文件。
variable
是HP的扩展,这对我没有帮助,这意味着我无法与其他Pascal实现相比


有谁知道这里发生了什么吗?

这已经有很长一段时间了,我找不到支持它的文档,但我认为这是一种特殊情况,使用
variable[]of char
作为参数的类型:

    localstring : VARYING[C_MaxLength] of CHAR
这不仅声明了参数
localstring
,还声明了一个局部范围的常量,该常量接收传入的实际字符串的大小。只是因为您将其命名为与全局常量相同的名称,才导致混淆。您实际上没有更改值
C\u MaxLength
。取而代之的是,在本地范围内有另一个
C_MaxLength

尝试将该行更改为类似以下内容:

    localstring : VARYING[foo] of CHAR

然后检查
foo
以及
C\u MaxLength
。我想你会看到
foo
是5,
C\u MaxLength
仍然是30。

我想你是对的。位于的文档说:“上限标识符指定字符字符串的最大长度,并且必须表示整数。表示最大长度的上限标识符可以视为只读值参数,在过程声明中隐式声明。”绝对正确。替换为foo导致名为foo的新变量变为可用,而C_MaxLength不受影响。谢谢你们的解释和文档链接。另外,对于将来阅读本文的任何人,PDF的相关页面为149页(编号为6-23)。