我認爲用示例展示問題的最簡單方法。代碼:OpenVMS Pascal常數用作大小初始值時不是常量
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中運行的代碼將使用該常量的原始值。
起初,這看起來像是一個編譯器bug,但我推論這個編譯器已經存在了足夠長的時間,以至於類似這樣的東西會被檢測到並且被修復或記錄。但是,我找不到關於此事的任何文件。 VARYING
是HP擴展,這意味着我無法與其他Pascal實現進行比較,這並沒有幫助。
做任何的大師知道更多關於這裏發生了什麼?
ISTM你說得對。 http://h20565.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c04619807上的文檔說:「上限標識符指定CHAR字符串的最大長度,並且必須表示一個整數,表示最大長度的上限標識符可以被認爲是READONLY值參數,在過程聲明中隱式聲明。 –
絕對正確。用foo替換導致名爲foo的新變量變爲可用,並且C_MaxLength不受影響。感謝你們的解釋和文檔鏈接。附:對於將來閱讀此內容的人來說,PDF的相關頁面是149(編號爲6-23)。 –