包装函数中的语句标签

时间:2014-01-08 11:01:07

标签: fortran

在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)                                     

有办法做到这一点吗?

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在最好的时候并不受欢迎。]此外,此状态传递可以推广到您想要传递标签的其他情况。