2012-04-18 1 views
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을 인쇄하면 변경됩니다. 이것은 정의되지 않은 동작입니까, 아니면 사양에 맞습니까?다른 엔티티 정의되지 않은 동작을 가진 인수에 동일한 엔티티가 전달되고 있습니까?

나는 이것이 완전히 일어날 것을 기대한다. 나는 행동에 의아해하지 않는다, 나는 그것이 유효한지 아닌지 이해하고 싶다.

답변

2

이것은 정의되지 않은 동작입니다. 인수에 POINTER 또는 TARGET 특성이없는 경우 일반적으로 Fortran은 인수 별칭 (즉, 동일한 실제 데이터를 가리키는 여러 인수)을 금지합니다.

+0

기술적으로 컴파일러는 이것을 잡아서 금지 할 수 있습니다. 왜 그렇게하지 않습니까? –

+0

@StefanoBorini : 1) 컴파일러 개발자는 무한한 시간을 가지지 않습니다. 2) IIRC 앨리어싱은 작성되지 않은 인수에 허용 될 수 있으며, 널리 사용되므로 지원되어야합니다. 3) 중요하지 않은 사항을 확인하고 위양성 (false positive)을 도입하지 않음 ((2) 참조). – janneb

+1

이것은 그리 쉬운 일이 아닙니다. 문제는 특정 상황, 즉 인수를 변경할 때만 발생합니다. 하나는 표준을 읽어야합니다. 두 가지 모두'의도 (IN) '이면 전적으로 괜찮습니다. 인수들 중 on이 'VALUE'에 의해 전달되면 동일하게 유지됩니다. –