在Fortran2003程序中,我想创建一个包含带asynchronous
属性的可分配数组的派生类型:
module async_in_type
type async_array
integer, dimension(:), allocatable, asynchronous :: a
end type async_array
end module async_in_type
当我尝试使用GCC编译上面的代码时,我收到以下错误消息:
$ gfortran -c -Wall -Wextra async_in_type.F90
GNU Fortran (GCC) 4.10.0 20140718 (experimental)
async_in_type.F90:3.52:
integer, dimension(:), allocatable, asynchronous :: a
1
Error: Attribute at (1) is not allowed in a TYPE definition
使用NAG Fortran,消息类似:
$ nagfor -c async_in_type.F90
NAG Fortran Compiler Release 6.0(Hibiya)
Product NPL6A60NA for x86-64 Linux
Error: async_in_type.F90, line 3: Syntax error
detected at ,@ASYNCHRONOUS
[NAG Fortran Compiler pass 1 error termination, 1 error]
这种限制的原因是什么?是否有可能克服这一限制?
答案 0 :(得分:3)
编译器消息非常清楚,让我重复一遍:
Error: Attribute at (1) is not allowed in a TYPE definition
因此标准不允许这样做。
您必须将asynchronous
属性放入async_in_type
类型的变量。
type(async_in_type), asynchronous :: x
答案 1 :(得分:0)
我会在Vladimir F's answer添加对引用的支持(以及一些推测)。是的,(Fortran 2008)标准不允许使用asynchronous
属性。
对于派生类型的组件,请查看4.5.4.1,其中给出了组件的允许属性(R437)。 asynchronous
未列出(问题dimension
和allocatable
)。
asynchronous
属性在5.3.4
具有ASYNCHRONOUS属性的实体是一个可能受异步输入/输出影响的变量。
这部分激发了限制:定义的组件本身不是变量。也许你想在定义中放置属性时要说的是这种类型的所有变量都有具有该属性的组件。
正如Vladimir F所说,在派生类型对象上指定了属性(可能甚至是隐含的 - 参见9.6.2.5 - 所以这个明确的确认可能不会太麻烦)。即使它不是,也可以说
asynchronous :: x%a ! Using Vladimir F's terminology
然后5.3.4还说具有该属性的变量的基础对象也应该具有该属性。我们进一步知道具有该属性的对象的子对象具有属性 - 所以"兄弟姐妹"异步组件的必须也是异步的。
如果我们来到"为什么我们不能拥有一些具有该属性的组件而一些没有?"那么我们必须推测,但至少有证据表明该标准的作者在拒绝它之前就考虑过这种可能性。
最后,R427(在4.5.2.1中)排除了案例type, asynchronous :: async_array