在Fortran中,有没有办法通过包装函数传递语句标签?
详细说明,我正在编写open()
的包装器,如下所示:
program test
contains
subroutine my_open(unit, file, err)
integer, intent(in) :: unit
character(*), intent(in) :: file
integer, intent(in), optional :: err
if (present(err)) then
open(unit, FILE=file, ERR=err)
else
open(unit, FILE=file)
end if
end subroutine my_open
end program test
(当然我的实际程序包含更多逻辑...)。但gfortran
抱怨
open(unit, FILE=file, ERR=err)
1
Error: Invalid value for ERR specification at (1)
有办法做到这一点吗?
答案 0 :(得分:3)
与err
对应的标签必须是open
的范围单元中的标签。所以你想做的事是不可能的。此外,为了回答您更普遍的问题,将标签作为变量传递本身是不可能的(至少,因为Fortran 95删除了指定的格式和gotos)。
但是,对于特定情况,可以使用iostat
代替,并将控制权交还给调用子程序。
像(简化)的东西:
call my_open(12, file, status)
! Instead of:
! 10 STOP
if (status.ne.0) then
!...
end if
end
subroutine my_open(unit, file, status)
integer, intent(in) :: unit
character(*), intent(in) ::file
integer, intent(out) :: status
open(unit, file=file, iostat=status)
if (iostat.ne.0) return
end subroutine
这可以说比从子程序中代码的一个非常不同的部分基本上是goto
要好得多。 [err
在最好的时候并不受欢迎。]此外,此状态传递可以推广到您想要传递标签的其他情况。