用作大小初始值设定项时,OpenVMS Pascal 常量不是常量
OpenVMS Pascal constant not constant when used as size initializer
我认为演示问题的最简单方法是举个例子。代码:
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。
我认为演示问题的最简单方法是举个例子。代码:
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。