依參照或依值傳遞引數
若要呼叫以非 Fortran 語言撰寫的子程式 (例如,使用者撰寫的 C 程式或作業系統常式) ,實際引數可能需要由不同於 Fortran所使用預設方法的方法傳遞。
C 常式 (包括系統檔案庫中的那些常式,例如 libc.a) 需要您依值而非參照來傳遞引數。 (雖然 C 會依值傳遞個別純量陣列元素,但它會依參照傳遞陣列。)
您可以使用 CALL 陳述式或函數參照的引數清單中的 %VAL 內建函數或 VALUE 屬性 及 %REF 內建函數,來變更預設傳遞方法。 您無法在 Fortran 程序參照的引數清單中使用它們,或與 替代 傳回指定元一起使用。
- %REF
- 依參照傳遞引數 (亦即,被呼叫的子程式會接收引數的位址)。 它與 Fortran 的預設呼叫方法相同,但它也會抑制字串的額外長度引數。
- %VAL
- 依值傳遞引數 (亦即,被呼叫的子程式會收到與實際引數具有相同值的引數,但此引數的任何變更都不會影響實際引數)。
您可以將此內建函數與實際引數搭配使用,這些引數是 CHARACTER(1)、 BYTE、邏輯、整數、實數或複式表示式或順序衍生類型。 衍生類型的物件不能包含長度大於一個位元組的指標、陣列或字元結構元件。
您不能將 %VAL 與實際引數搭配使用,這些引數是長度大於一個位元組的陣列實體、程序名稱或字元表示式。
%VAL 會使 Open XL Fortran 將實際引數當作 32 位元或 64 位元 中間值來傳遞。
- 32 位元中間值
- 如果實際引數是下列其中一項:
- 小於 32 位元的整數或邏輯,它是符號延伸到 32 位元值。
- 大於 32 位元的整數或邏輯,會以兩個 32 位元中間值來傳遞。
- 若為實數或複數類型,則會傳遞為多個 32 位元中間值。
- 對於序列衍生類型,它會作為多個 32 位元中間值來傳遞。
以位元組命名的常數和變數會當作 INTEGER(1)來傳遞。 如果實際引數是 CHARACTER(1),則不論您是否指定 -qctyplss 編譯器選項,編譯器都會將左側的引數以零填補至 32 位元值。
- 64 位元中間值
- 如果實際引數是下列其中一項:
- 小於 64 位元的整數或邏輯,它是符號延伸為 64 位元值。
- 若為 real 或 complex 類型,則會以多個 64 位元中間值傳遞。
- 若為序列衍生類型,則會以多個 64 位元中間值傳遞。
- VALUE 屬性
- 指定虛擬與實際引數之間的引數關聯,可讓您以實際引數的值來傳遞虛擬引數。 對虛擬引數的值或定義狀態所做的變更不會影響實際引數。
您必須僅針對虛擬引數指定 VALUE 屬性。
您不得使用 %VAL 或 %REF 內建函數,以 VALUE 屬性或相關聯的實際引數來參照虛擬引數。
具有含 VALUE 屬性之虛擬引數的參照程序必須具有明確介面。
您不得使用下列項目來指定 VALUE 屬性:- 陣列
- 具有 ALLOCATABLE 元件的衍生類型
- 虛擬程序
EXTERNAL FUNC
COMPLEX XVAR
IVARB=6
CALL RIGHT2(%REF(FUNC)) ! procedure name passed by reference
CALL RIGHT3(%VAL(XVAR)) ! complex argument passed by value
CALL TPROG(%VAL(IVARB)) ! integer argument passed by value
END