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