3

我在以下示例中定义了一个带有私有组件的结构:

module mtypes
    implicit none

    type mytype
        integer, private :: nr
    end type

end module mtypes

program main

    use mtypes
    type(mytype) :: t1

    t1 = mytype(1)
    print *, t1

end program main

以 1 作为参数调用结构构造函数。据我了解,这应该是不可能的,因为nr是私人的。但是,这是由 编译的Intel(R) Visual Fortran Compiler XE 14.0.5.239 [IA-32],而不是gfortran 4.9.3using编译的cygwin。此外,该print语句显示nr输出中的值。Fortran使用最新标准以这种方式定义具有私有组件的结构是否有效?或者这是英特尔编译器的错误?

4

1 回答 1

4

在 Fortran 2008 草案中,隐式(即来自派生类型定义的那些)结构构造函数在 4.5.10 中有详细说明。一个约束条件是

出现组件规范的类型名称和所有类型的组件应可在包含结构构造函数的范围单元中访问。

由于组件nr在主程序中不可访问,因此将其nr作为组件规范违反了此约束。在模块中使用这个隐式结构构造函数就可以了,就像私有组件的默认初始化一样。

nagfor 也因此抱怨您的代码示例。

print声明中,这显然是无效的,ifort 15 对此表示抱怨。要t1出现在输出列表中,您必须使用定义输出过程。

于 2015-07-16T12:01:10.833 回答