首页 文章

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

提问于
浏览
6

假设我有一个子程序,它接受两个数组作为输入 . 一个是意图(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 回答

  • 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

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

    call sub_b((array),array)
    

相关问题