依參照或依值傳遞引數

若要呼叫以非 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 位元中間值傳遞。
以位元組命名的常數和變數會當作 INTEGER(1)來傳遞。 如果實際引數是 CHARACTER(1),不論您是否指定 -qctyplss 編譯器選項,編譯器都會將它左側的零填補為 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