将可分配变量传递给具有不可分配参数的子例程有什么影响?

时间:2017-01-16 10:44:08

标签: fortran

假设我们有这个变量定义

Real*8, Dimension(:), Allocatable :: dblA
Allocate  (dblA(1000))

现在我调用这个子程序:

Call MySub(dblA)

其中:

Subroutine MySub(dblA)
Real*8,  INTENT(Out), DIMENSION(1000) :: dblA
End

这种做法的副作用是什么? 我应该避免这个吗?

2 个答案:

答案 0 :(得分:5)

如果在传递给子程序之前已经分配了数组,则子程序与allocatable-ness无关,效果与数组是静态的相同。在你向我们展示的片段中,没有什么可以反对,也没有练习避免。但是,这些片段实际上做的很少,而且很容易想到扩展它们以使这个建议失效的方法。

现在帮自己一个忙,改变

Real*8,  INTENT(Out), DIMENSION(1000) :: dblA

Real*8,  INTENT(Out), DIMENSION(:) :: dblA

这样子程序无论传递的数组大小如何都能正常工作。使用dblA作为虚拟和实际参数的名称可能也是一个坏主意,你只会迷惑自己。

real*8并不是,而且从来就不是一种声明8字节实数的标准兼容方式。在这一点上,请在SO上看到许多问题和答案。

答案 1 :(得分:3)

High Performance Mark's answer说了我想要的一切。我会重复一个方面,重点强调。

非常需要在调用子例程时分配子例程中的可分配数组。 [并且在问题的情况下,足够大。]

为了使这个答案不仅仅是一个评论,我将解决更一般的问题标题。在此之前,我将研究一些可能出现在思考中的事物"可分配或不可分配的伪参数"。

  • 因为伪参数(子例程中的参数)具有intent(out)属性,并且实际参数变为未定义。如果伪参数是可分配的,那么它也会在输入时被释放。在这种情况下,实际参数仍然是分配的和原始大小。

  • 不可分配,伪参数(和实际参数)不能查询或更改分配状态;伪参数不能进一步传递给期望可分配参数的过程,即使实际参数可能是。

  • 如果伪参数是可分配的而不是(静态)显式形状数组,则实际参数也必须是可分配的数组。

  • 使用可分配的伪参数,在引用子例程时需要显式接口。 [有人会说,即使在隐式界面很好的情况下,这也是一个好主意。]

对于更一般的事情,我将给出一个示例,其中对可分配的实际/不可分配的虚拟对象有限制(F2008,12.5.2.4):

  

如果实际参数是多态的coindexed对象,则伪参数不应是多态的。

但对于大多数人来说,这并不值得担心。

哦,还有另外一件事我会从另一个答案中恢复过来:Real*8应该避免。