我在以下示例中定义了一个包含私有组件的结构:
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.3
使用cygwin
编译的。此外,print
语句在输出中显示nr
的值。使用最新标准以这种方式定义具有私有组件的结构是否有效Fortran
?或者这是intel编译器的错误?
答案 0 :(得分:3)
在Fortran 2008的草案中,4.5.10中详细介绍了隐式(即来自派生类型定义的那些)结构构造函数。给出的一个约束是
在包含结构构造函数的作用域单元中,可以访问类型名称和组件规范出现的类型的所有组件。
由于在主程序中无法访问组件nr
,因此nr
作为组件规范会违反此约束。在模块中使用这个隐式结构构造函数就可以了,就像私有组件的默认初始化一样。
在print
声明中,这显然无效,ifort 15抱怨这一点。要使t1
出现在输出列表中,必须使用define输出过程。