我尝试以下代码,并发现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
答案 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左右支持类似第一个例子的语法......)