在我的代码中,我有一个基本的子例程,基本上是这样的:
elemental subroutine calc_stuff (x, a, b, c)
real, intent(in) :: a, b, c
real, intent(out) :: x
x = a/b + c
end subroutine calc_stuff
我改为:
elemental subroutine calc_stuff (x, a, t)
real, intent(in) :: a
type(mytype), intent(in) :: t
real, intent(out) :: x
x = a/t%b + t%c
end subroutine calc_stuff
其中mytype
是包含一些标量real
和integer
以及real, allocatable
数组的类型。成员b
和c
是real
,因此第二个版本与第一个基本相同。
第二个版本可以在各种编译器(Cray,Intel,NEC,GFortran)上很好地编译,但是现在我读到了元素子例程的标准状态:
所有伪参数都必须是标量,并且不能具有ALLOCATABLE或POINTER属性。
因此,当将用户定义的类型传递给基本子例程时,我的代码是否不符合标准,但是所有编译器都“知道”我想要什么,因为我仅使用该类型的标量而不是可分配数组?还是我误解了标准的措辞,第二版一切正常?
答案 0 :(得分:3)
伪参数t
是标量 1 ,没有指针属性,也没有可分配属性。它不违反条件。
该类型的组件的属性与该类型本身的属性无关。
1 派生类型并不意味着对象不一定非标量。即使具有多个或数组组件,对象本身仍可能是标量的。派生类型数组是具有该类型元素的数组。还考虑一下像character(len=3) name
这样的字符对象:它是标量,但是由多个子字符串组成。