Fortran中TYPE中的关键字OPTIONAL不起作用

时间:2015-03-30 08:13:44

标签: fortran intel-fortran fortran2003

我尝试以下代码,并发现OPTIONAL关键字不起作用。编译没问题,但运行时错误会提示。

我知道通常应该在模块中使用INTERFACE来为例程提供足够的信息。我也尝试过,但无论在哪里放置INTERFACE都无法完成编译。

我已经阅读了一些在TYPE声明中使用OPTIONAL的代码。 https://www.pgroup.com/lit/articles/insider/v3n1a3.htm

现在我正在使用intel visual fortran,那么有什么不同吗?

module testA_m
implicit none

type :: onion_c
    contains
    procedure :: testA
end type

contains

subroutine testA(this, a,b)
    implicit none
    class(onion_c) :: this
    real*8 :: a
    real*8, optional :: b

    write(*,*) a,b
end subroutine    
end module

program main
call testIt()
end program

subroutine testIt()
use testA_m
implicit none
type(onion_c) :: onion
real*8 :: c1 
real*8 :: c2

c1 = 1.0d0
c2 = 2.0d0
call onion.testA(c1)

end subroutine

3 个答案:

答案 0 :(得分:1)

嗯,您正在尝试打印b,但未传递给子例程。因此访问违规。

您应首先检查b

subroutine testA(this, a,b)
    implicit none
    class(onion_c) :: this
    real*8 :: a
    real*8, optional :: b

    if ( present(b) ) then
      write(*,*) a,b
    else
      write(*,*) a
    endif
end subroutine   

答案 1 :(得分:0)

也许我需要另一个变量用于实际操作。如下所示。

我仍然期待直接使用b的更好解决方案。

subroutine testA(this, a,b)
    implicit none
    class(onion_c)   :: this
    real*8           :: a
    real*8, optional :: b
    real*8           :: bUsed

    if ( present(b) ) then
        bUsed = b
        write(*,*) a,bUsed
    else
        bUsed = 2.00d0
        write(*,*) a,bUsed
    endif
end subroutine   

答案 2 :(得分:0)

因为Fortran不支持像

这样的程序
subroutine testA( this, a, b=10.0d0 )

我通常在公共头文件中定义如下的宏

#define _optval_(x,xopt,default)   x = default; if (present(xopt)) x = xopt

然后在子程序的顶部使用它,如

subroutine testA(this, a,b_)
class(onion_c)   :: this
real*8           :: a
real*8, optional :: b_
real*8  b

_optval_( b, b_, 10.0d0 )  !! use only b from here on

虽然这与编写几个IF结构没有本质区别,但我觉得它更方便(至少对于简单变量而言),因为无需担心b在后续代码中是否可选。 (但坦率地说,我希望Fortran2020左右支持类似第一个例子的语法......)