Fortran 将同一实体传递给具有不同意图的参数是否为未定义行为?
在这段代码中,我将相同的数组Fortran 将同一实体传递给具有不同意图的参数是否为未定义行为?,fortran,fortran90,Fortran,Fortran90,在这段代码中,我将相同的数组I传递给baz,将其绑定到具有不同意图的参数。当然,当我打印a时,它会发生变化。这是未定义的行为,还是符合规范 请注意,我完全期待这种情况发生。我对这种行为并不感到困惑,我只是想知道它是否有效。这是一种未定义的行为。Fortran通常禁止参数别名(即指向同一实际数据的多个参数),除非这些参数具有指针或目标属性。从技术上讲,编译器应该能够捕获并禁止这种情况,为什么不这样呢?@StefanoBorini:1)编译器开发人员没有无限的时间。2) IIRC别名可能被允许用于未
I
传递给baz,将其绑定到具有不同意图的参数。当然,当我打印a
时,它会发生变化。这是未定义的行为,还是符合规范
请注意,我完全期待这种情况发生。我对这种行为并不感到困惑,我只是想知道它是否有效。这是一种未定义的行为。Fortran通常禁止参数别名(即指向同一实际数据的多个参数),除非这些参数具有指针或目标属性。从技术上讲,编译器应该能够捕获并禁止这种情况,为什么不这样呢?@StefanoBorini:1)编译器开发人员没有无限的时间。2) IIRC别名可能被允许用于未写入的参数,或者被广泛使用,因此必须得到支持。3) 检查非平凡案例和不引入误报的困难(见(2))。这并不容易。问题只会在某些情况下出现,即改变参数时。人们应该阅读标准。如果两者都是
intent(IN)
,则完全可以。如果参数的on由值
传递,则同样适用。非法情况与编译器需要检测的非法情况之间存在差异。这是一个相关的问题:
module foo
contains
subroutine bar()
integer :: i(3)
i(1) = 1
i(2) = 2
i(3) = 3
call baz(i, i)
end subroutine
subroutine baz(a,b)
integer, intent(in) :: a(:)
integer, intent(inout) :: b(:)
b(2) = 5
print *, a
print *, b
end subroutine
end module
program xx
use foo
call bar()
end program