6

假设我有一个接受两个数组作为输入的子程序。一个被赋予intent(in),另一个被赋予intent(out)。后者以任意方式从前者派生而来。但是,如果我为两个虚拟参数传递相同的实际参数怎么办?通常,结果不会是子例程的预期结果。请参阅下面的代码片段。

问题是,编译器似乎并不关心,即使我已经给出了意图标志。我正在使用带有所有诊断功能的 Intel 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
4

2 回答 2

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”中进行了描述。

于 2011-08-22T02:00:23.883 回答
1

将括号放在意图(in)的参数周围使代码合法,因为您有效地传递了一个副本:

call sub_b((array),array)
于 2014-03-31T19:44:44.173 回答