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

Dut*_*cko 3 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.
Run Code Online (Sandbox Code Playgroud)

编译:

>pascal /version
HP Pascal I64 V6.1-116 on OpenVMS I64 V8.4
>pascal constantstringinit
>link constantstringinit
>run constantstringinit
Run Code Online (Sandbox Code Playgroud)

并输出:

small_string length:          5
small_string size:          5
C_MaxLength:         30
localstring length:          5
localstring size:          5
C_MaxLength:          5
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该值C_MaxLengthLocalProc过程中已在本地更改.这是奇怪的,因为它已被宣布为常数.

常量的新值仅在过程的范围内LocalProc.在调用main之后运行的代码LocalProc将使用常量的原始值.

起初这对我来说看起来像编译器错误,但我推断这个编译器已经存在很长时间,以至于这样的东西会被检测到并且被修复或记录.但是,我找不到有关此事的任何文件.这对VARYINGHP扩展没有帮助,这意味着我无法与其他Pascal实现进行比较.

有没有大师知道这里发生了什么?

Adr*_*thy 6

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

    localstring : VARYING[C_MaxLength] of CHAR
Run Code Online (Sandbox Code Playgroud)

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

尝试将该行更改为:

    localstring : VARYING[foo] of CHAR
Run Code Online (Sandbox Code Playgroud)

然后检查foo以及C_MaxLength.我希望你会看到foo5并且C_MaxLength仍然是30.

  • ISTM,你是对的.http://h20565.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c04619807上的文档说:"上限标识符指定VARYING OF CHAR字符串的最大长度,必须表示表示最大长度的上限标识符可以被认为是一个READONLY值参数,在过程声明中隐式声明." (2认同)