在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]这种限制的原因是什么?是否有可能克服这个限制?
发布于 2014-12-19 11:58:09
编译器的信息是准确和非常清楚的,让我重复一遍:
Error: Attribute at (1) is not allowed in a TYPE definition所以这是不被标准允许的。
必须将asynchronous属性放置到async_in_type类型的变量中。
type(async_in_type), asynchronous :: x发布于 2015-03-13 17:09:36
我将通过引用(和一些推测)添加对Vladimir F's answer的支持。是的,(Fortran 2008)标准不允许使用asynchronous属性。
对于派生类型的组件,请查看4.5.4.1,其中给出了组件的允许属性(R437)。asynchronous只是没有列出(问题的dimension和allocatable是这样的)。
asynchronous属性在5.3.4中进行了描述
具有异步属性的实体是可能受异步输入/输出影响的变量。
这在一定程度上激发了限制:定义的组件本身并不是一个变量。在定义中放置属性时,您可能想说的是,这种类型的所有变量都有带有该属性的组件。
正如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的情况
https://stackoverflow.com/questions/27565264
复制相似问题