1
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
이 코드에서는 동일한 배열 을 baz에 전달하고 다른 인 텐트가있는 인수에 바인딩합니다. 물론 a
을 인쇄하면 변경됩니다. 이것은 정의되지 않은 동작입니까, 아니면 사양에 맞습니까?다른 엔티티 정의되지 않은 동작을 가진 인수에 동일한 엔티티가 전달되고 있습니까?
나는 이것이 완전히 일어날 것을 기대한다. 나는 행동에 의아해하지 않는다, 나는 그것이 유효한지 아닌지 이해하고 싶다.
기술적으로 컴파일러는 이것을 잡아서 금지 할 수 있습니다. 왜 그렇게하지 않습니까? –
@StefanoBorini : 1) 컴파일러 개발자는 무한한 시간을 가지지 않습니다. 2) IIRC 앨리어싱은 작성되지 않은 인수에 허용 될 수 있으며, 널리 사용되므로 지원되어야합니다. 3) 중요하지 않은 사항을 확인하고 위양성 (false positive)을 도입하지 않음 ((2) 참조). – janneb
이것은 그리 쉬운 일이 아닙니다. 문제는 특정 상황, 즉 인수를 변경할 때만 발생합니다. 하나는 표준을 읽어야합니다. 두 가지 모두'의도 (IN) '이면 전적으로 괜찮습니다. 인수들 중 on이 'VALUE'에 의해 전달되면 동일하게 유지됩니다. –