FORTRAN 95:OPTIONAL语句不起作用(使用FTN95和Plato)

时间:2013-08-18 14:41:27

标签: fortran subroutine optional plato

我在使用Fortran 95的函数和子程序中遇到OPTIONAL语句有问题。目前我正在使用Silverfrost的Plato和他们的FTN95编译器(在“Release Win32”模式下)。在我正在编写的更复杂的程序中尝试实现OPTIONAL语句之后,我创建了一个非常简单的程序来测试它。这是代码:

program TEST

implicit none
integer :: a=1, b=2

call Z(a,b)
call Z(a)
call Z(b)

end program TEST

subroutine Z(x,y)
implicit none
integer :: x
integer, optional :: y

if (present(y)) then
  write(*,*) x, y
  else
    write(*,*) x
endif

end subroutine Z

我预计屏幕上会显示以下结果:

1 2
1
2

嗯,代码编译,虽然我得到一个警告(673)“SUBROUTINE Z被调用的参数太少”。执行后,我进入我的屏幕:

1 2

然后出现“访问冲突”错误消息。有人能理解这里有什么问题吗?

非常感谢! 吉尔伯托

2 个答案:

答案 0 :(得分:7)

尝试将子例程放在模块中,如下所示:

module testoptional
contains
    subroutine Z(x,y)
    implicit none
    integer :: x
    integer, optional :: y

    if (present(y)) then
      write(*,*) x, y
      else
        write(*,*) x
    endif

    end subroutine Z
end module testoptional

program TEST
    use testoptional
    implicit none
    integer :: a=1, b=2

    call Z(a,b)
    call Z(a)
    call Z(b)

end program TEST

编译并运行然后使用gfortran和ifort提供预期结果。

问题在于主程序如何知道(或猜测)Z(x,y)的接口。在你提供的代码中,虽然主程序和子程序在同一个文件中,但没有明确告诉主程序接口 - {{1}的调用顺序,包括参数计数,类型等等。 }。第一个调用是Z,因此它推断出那里有一个带有两个参数的子程序;然后它尝试用一个参数调用它,但失败了。

将子例程放在一个模块中,然后使用该模块(您也可以使用Z(a,b)作为包含的子例程,或使用contains块显式地/手动地为主程序提供接口)然后给出主程序需要有关调用序列的信息 - 例如,那里有一个可选参数 - 并且事情正常。

答案 1 :(得分:2)

带有可选参数的过程必须具有显式接口,因此请尝试给Z一个。 (例如,只使用短模块中的子程序。)

我手头没有这个特定的编译器,但是在使用Cray编译器时遇到这样的情况时出错了。