2017-06-22 33 views
3

我認爲用示例展示問題的最簡單方法。代碼: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實現進行比較,這並沒有幫助。

做任何的大師知道更多關於這裏發生了什麼?

回答

6

這是一個很長的時間,我無法找到的文件來支持它,但我認爲這是一個使用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.

+2

ISTM你說得對。 http://h20565.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c04619807上的文檔說:「上限標識符指定CHAR字符串的最大長度,並且必須表示一個整數,表示最大長度的上限標識符可以被認爲是READONLY值參數,在過程聲明中隱式聲明。 –

+0

絕對正確。用foo替換導致名爲foo的新變量變爲可用,並且C_MaxLength不受影響。感謝你們的解釋和文檔鏈接。附:對於將來閱讀此內容的人來說,PDF的相關頁面是149(編號爲6-23)。 –