2012-11-21 2 views
5

고려 : 위의 코드와 아무 잘못이명시 적 인터페이스가없는 루틴에 할당되지 않은 배열을 전달하는 데 문제가 있습니까?

program main 
real, allocatable, dimension(:) :: foo 
integer n 
n=10 
call dofoo(foo,n,1) 
allocate(foo(n)) 
call dofoo(foo,n,0) 
end program main 

subroutine dofoo(foo,n,mode) 
real foo(n) 
integer i,n,mode 
if(mode.eq.1)then 
    n=6 
    return 
endif 
do i=1,n 
    foo(i)=i 
enddo 
return 
end subroutine dofoo 

있습니까? (그것은 gfortran과 함께 작동합니다.) 할당되지 않은 배열을 처음으로 통과하지만, 나는 그것을 건드리지 않습니다. - 표준에 시스템 의존적 인 방식으로 동작 할 수있는 것이 있습니까?

답변

5

당신은 거의 자신의 질문에 답변했습니다. 예, 표준에 따르면 범위에 인터페이스가없는 경우 할당되지 않은 할당 가능 배열을 실제 인수로 전달하는 것은 항상 잘못된 것입니다.

범위에 인터페이스가있는 경우 더미 인수가 할당 가능한 경우에만 유효합니다.

그리고 나는 그것에 의해 물 렸습니다. 내 문제는 호출하기 전에 크기가 0으로 할당되었습니다.

+0

감사합니다. 나는 이것이 사실이라고 걱정했다. 나는 표준이 무엇을 말했는지 알지 못했다. (나는 f77 표준에 매우 익숙하지만 실제로 f90 표준의 대부분을 읽지 않았다.) – mgilson

+0

위의 코드는 위의 gfortran과 작동한다. 버그 수정) – mgilson

+3

할당 가능한 배열을 지나가는 것은 F95 표준에 대한 TR 때까지 지워지지 않았습니다. 할당 된 상태 및 차원은 할당 가능한 배열 변수의 _part_입니다. 의도적 인 (in) 또는 의도 (out)와 같은 것들은 배열의 _values_가 변경 될 수있을뿐만 아니라 크기 나 할당 상태가 변경 될 수 있는지 여부를 알려주기 때문에 중요합니다. 명시 적 인터페이스가 없으면 프로그램은 할당 가능한 배열을 전달할 때 최악의 경우를 가정해야합니다. 반환 할 때 더 이상 크기를 알지 못할 수도 있습니다. 이는 일반적인 경우에 엄청난 성능 저하입니다. 따라서 명시적인 인터페이스가 있어야한다는 결론이났습니다. –