OpenVMS Pascal中的常量在用作大小初始化器时不是常量

4

我认为最简单的展示问题的方式是通过一个例子。代码:

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

起初,我认为这是编译器的错误,但我推断出这个编译器已经存在了足够长的时间,这样的问题应该已经被检测到并且已经修复或记录下来。但是,我找不到任何相关的文档。 VARYING是HP扩展,这意味着我无法与其他Pascal实现进行比较。

有没有高手知道这里发生了什么?

1个回答

6

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

    localstring : VARYING[C_MaxLength] of CHAR

这不仅声明了参数localstring,而且还声明了一个本地范围的常量,该常量接收传递的实际字符串的大小。只有因为您将其命名为与全局常量相同的名称才会导致混淆。 您实际上没有更改C_MaxLength的值。 相反,您在本地作用域中有了另一个C_MaxLength
尝试将该行更改为以下内容:
    localstring : VARYING[foo] of CHAR

然后检查fooC_MaxLength。我希望您能看到foo为5,而C_MaxLength仍为30。


2
我认为你是正确的。http://h20565.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c04619807 上的文档说:“upper-bound-identifier 指定 VARYING OF CHAR 字符串的最大长度,必须表示为整数。代表最大长度的 upper-bound-identifier 可以被视为 READONLY 值参数,在过程声明中隐式声明。” - Rudy Velthuis
完全正确。用foo替换后,一个名为foo的新变量就可用了,而C_MaxLength则不受影响。感谢你们两位的解释和文档链接。附言:对于未来阅读此内容的任何人,相关PDF页面为149页(编号为6-23)。 - Dutch Gecko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接