用户定义的类型作为基本子例程的参数?

时间:2018-07-11 06:34:05

标签: fortran parameter-passing

在我的代码中,我有一个基本的子例程,基本上是这样的:

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是包含一些标量realinteger以及real, allocatable数组的类型。成员bcreal,因此第二个版本与第一个基本相同。

第二个版本可以在各种编译器(Cray,Intel,NEC,GFortran)上很好地编译,但是现在我读到了元素子例程的标准状态:

  

所有伪参数都必须是标量,并且不能具有ALLOCATABLE或POINTER属性。

因此,当将用户定义的类型传递给基本子例程时,我的代码是否不符合标准,但是所有编译器都“知道”我想要什么,因为我仅使用该类型的标量而不是可分配数组?还是我误解了标准的措辞,第二版一切正常?

1 个答案:

答案 0 :(得分:3)

伪参数t是标量 1 ,没有指针属性,也没有可分配属性。它不违反条件。

该类型的组件的属性与该类型本身的属性无关。


1 派生类型并不意味着对象不一定非标量。即使具有多个或数组组件,对象本身仍可能是标量的。派生类型数组是具有该类型元素的数组。还考虑一下像character(len=3) name这样的字符对象:它是标量,但是由多个子字符串组成。