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

6
假设我有一个子程序,它接受两个数组作为输入。其中一个是给定的intent(in),另一个是给定的intent(out)。后者以任意方式从前者派生而来。但是,如果我为这两个虚拟参数传递相同的实际参数会怎样呢?一般情况下,子程序的结果将不是预期的结果。请参见下面的代码片段。
问题在于,编译器似乎并不关心,即使我已经给出了intent标志。我正在使用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
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 编译器不需要诊断语言规则的所有违规行为,这似乎是编译器未能识别的一个例子。
编辑:允许别名操作。禁止的是通过别名(此处为另一个虚拟参数)更改虚拟参数的值。指针和目标参数的规则不那么严格。具体规则在 "The Fortran 2003 Handbook"(由 Adams 等人撰写)中有描述。

谢谢,这样就清楚了。很遗憾,Intel Visual Fortran没有对此发出警告。我想唯一的解决方案就是在使用适当的子程序调用时保持纪律。 - bdforbes
你认为比较两个输入数组的位置怎么样?这样做安全吗?另外,显然F2003没有实现loc函数,有没有相应的替代方法? - bdforbes

1
将intent(in)参数括在括号中使代码合法,因为您实际上正在传递副本:
call sub_b((array),array)

1
这是Fortran标准的一部分吗? - Scientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接