Fortran:将同一个数组作为两个伪参数传递给子程序

时间:2011-08-22 01:00:22

标签: fortran fortran95

假设我有一个子程序,它接受两个数组作为输入。一个是意图(in),另一个是intent(out)。后者以任意方式来自前者。但是,如果我为两个伪参数传递相同的实际参数,该怎么办?通常,结果将不是子例程的预期结果。请参阅下面的代码段。

问题是,编译器似乎并不关心,即使我已经给出了意图标志。我正在使用英特尔Visual Fortran Composer 12,具有所有诊断功能。有没有更好的方法来编写子程序,或者我缺少一些编译器选项,以使代码更安全?

module foo

    contains

    subroutine sub_a()
        implicit none
        real::array(10,10)

        call sub_b(array,array)

    end subroutine

    subroutine sub_b(array1,array2)
        implicit none
        real,intent(in)::array1(10,10)
        real,intent(out)::array2(10,10)

        !array2 is derived from array1 somehow

    end subroutine

end module foo

2 个答案:

答案 0 :(得分:8)

这称为别名 - 通过两个不同的名称引用相同的项目。在大多数情况下,Fortran不允许这样做。您的示例不是合法的Fortran - 请参阅具有此特定情况的http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2/,通过用于两个伪参数的相同实际参数进行别名。 Fortran编译器不需要诊断所有违反语言规则的行为,这似乎是编译器无法识别的示例。

编辑:允许别名。禁止的是通过别名更改伪参数的值,这里是另一个伪参数。规则对指针和目标参数的限制较少。具体规则在Adams等人的“The Fortran 2003 Handbook”中有描述。

答案 1 :(得分:1)

将括号括在意图(in)的参数周围会使代码合法,因为您实际上是在传递副本:

call sub_b((array),array)