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과 함께 작동합니다.) 할당되지 않은 배열을 처음으로 통과하지만, 나는 그것을 건드리지 않습니다. - 표준에 시스템 의존적 인 방식으로 동작 할 수있는 것이 있습니까?
감사합니다. 나는 이것이 사실이라고 걱정했다. 나는 표준이 무엇을 말했는지 알지 못했다. (나는 f77 표준에 매우 익숙하지만 실제로 f90 표준의 대부분을 읽지 않았다.) – mgilson
위의 코드는 위의 gfortran과 작동한다. 버그 수정) – mgilson
할당 가능한 배열을 지나가는 것은 F95 표준에 대한 TR 때까지 지워지지 않았습니다. 할당 된 상태 및 차원은 할당 가능한 배열 변수의 _part_입니다. 의도적 인 (in) 또는 의도 (out)와 같은 것들은 배열의 _values_가 변경 될 수있을뿐만 아니라 크기 나 할당 상태가 변경 될 수 있는지 여부를 알려주기 때문에 중요합니다. 명시 적 인터페이스가 없으면 프로그램은 할당 가능한 배열을 전달할 때 최악의 경우를 가정해야합니다. 반환 할 때 더 이상 크기를 알지 못할 수도 있습니다. 이는 일반적인 경우에 엄청난 성능 저하입니다. 따라서 명시적인 인터페이스가 있어야한다는 결론이났습니다. –