引用组件

您可以使用 组件标志符来引用特定结构组件。 标量组件标志符具有以下语法:

scalar_struct_comp:

读取语法图跳过可视语法图名称(int_expr_list)分隔符comp_name(int_expr_list)
NAME
是派生类型对象的名称
comp_name
是派生类型组件的名称
int_expr
是称为下标表达式的标量整数或实数表达式
separator
% .

结构组件具有与最右边的 comp_name相同的类型,类型参数和 POINTER 属性 (如果有)。 它从父对象继承任何 INTENTTARGETPARAMETER 属性。

注意:
  • 每个 comp_name 都必须是前一个 名称comp_name的声明类型的组件。
  • name 和每个 comp_name(最右边除外) 必须是派生类型。
  • 任何 int_expr_list 中的下标表达式数必须等于前面 名称comp_name的秩。
  • name 必须是数据对象的名称。
  • 只有 name 或最多一个 comp_name 可以具有非零列组。 如果 namecomp_name 具有非零列组,那么右侧的 comp_name 不得具有 ALLOCATABLEPOINTER 属性。
  • 结构组件的列组是具有非零列组 (如果有) 的 comp_name 的名称的列组。 否则,列组为零。
  • FORTRAN 2003 开始 如果 最右侧comp_name的声明类型为抽象类型,则结构组件必须是多态的。 Fortran 2003 结束

在名称列表格式中,分隔符必须是百分号。

如果表达式具有可以使用句点作为分隔符或作为二进制操作解释为结构组件的表单,并且可以在作用域限定单元中访问具有该名称的运算符,那么 IBM® Open XL Fortran 会将表达式视为二进制操作。 如果这不是您想要的解释,那么应该使用百分号来取消引用部件,或者以自由源形式在句点与 comp_name之间插入空格。

示例

示例 1: 不明确使用句点作为分隔符

        MODULE MOD
          STRUCTURE /S1/
            STRUCTURE /S2/ BLUE
              INTEGER I
            END STRUCTURE
          END STRUCTURE
          INTERFACE OPERATOR(.BLUE.)
            MODULE PROCEDURE BLUE
          END INTERFACE
        CONTAINS
          INTEGER FUNCTION BLUE(R1, I)
            RECORD /S1/ R1
            INTENT(IN) :: R1
            INTEGER, INTENT(IN) :: I
            BLUE = R1%BLUE%I + I
          END FUNCTION BLUE
        END MODULE MOD

        PROGRAM P
          USE MOD
          RECORD /S1/ R1
          R1%BLUE%I = 17
          I = 13
          PRINT *, R1.BLUE.I ! Calls BLUE(R1,I) - prints 30
          PRINT *, R1%BLUE%I ! Prints 17
        END PROGRAM P

示例 2: 混合分隔符


        STRUCTURE /S1/
          INTEGER I
        END STRUCTURE
        STRUCTURE /S2/
          RECORD /S1/ C
        END STRUCTURE
        RECORD /S2/ R
        R.C%I = 17 ! OK
        R%C.I = 3 ! OK
        R.C.I = 19 ! OK
        END
        

示例 3: 任何派生类型的百分比和周期工作

        STRUCTURE /S/
          INTEGER I, J
        END STRUCTURE
        TYPE DT
          INTEGER I, J
        END TYPE DT
        RECORD /S/ R1
        TYPE(DT) :: R2
        R1.I = 17; R1%J = 13
        R2.I = 19; R2%J = 11
        END