2011-09-20 53 views
1

在调用函数我有这样的:FORTRAN如何与可选参数交互?

call ESMF_TimeGet(date, yy=year, mm=month, dd=day, s=sec, rc=rc) 

ESMF_TimeSet的签名是:

! ESMF_TimeGet - Get value in user-specified units 
subroutine ESMF_TimeGet(time, YY, YRl, MM, DD, D, Dl, H, M, S, Sl, MS, & 
         US, NS, d_, h_, m_, s_, ms_, us_, ns_, Sn, Sd, & 
         dayOfYear, dayOfYear_r8, dayOfYear_intvl,  & 
         timeString, rc) 


    type(ESMF_Time), intent(in) :: time 
    integer, intent(out), optional :: YY 
    integer(ESMF_KIND_I8), intent(out), optional :: YRl 
    integer, intent(out), optional :: MM 
    integer, intent(out), optional :: DD 
    integer, intent(out), optional :: D 
    integer(ESMF_KIND_I8), intent(out), optional :: Dl 
    integer, intent(out), optional :: H 
    integer, intent(out), optional :: M 
    integer, intent(out), optional :: S 
    integer(ESMF_KIND_I8), intent(out), optional :: Sl 
    integer, intent(out), optional :: MS 
    integer, intent(out), optional :: US 
    integer, intent(out), optional :: NS 
    double precision, intent(out), optional :: d_ 
    double precision, intent(out), optional :: h_ 
    double precision, intent(out), optional :: m_ 
    double precision, intent(out), optional :: s_ 
    double precision, intent(out), optional :: ms_ 
    double precision, intent(out), optional :: us_ 
    double precision, intent(out), optional :: ns_ 
    integer, intent(out), optional :: Sn 
    integer, intent(out), optional :: Sd 
    integer, intent(out), optional :: dayOfYear 
    real(ESMF_KIND_R8), intent(out), optional :: dayOfYear_r8 
    character (len=*), intent(out), optional :: timeString 
    type(ESMF_TimeInterval), intent(out), optional :: dayOfYear_intvl 
    integer, intent(out), optional :: rc 

    type(ESMF_TimeInterval) :: day_step 
    integer :: ierr 

当我打电话ESMF_TimeSet如何能够将yy=yr参数转换成yy变量子程序在子程序中(同样适用于mmdd)?另外,FORTRAN是否关心变量的大小写敏感性?

+0

只是为了澄清:你谈论'TimeSet',但给出的代码是'TimeGet'。 – Howard

回答

6

子程序如何将子程序中的“yy = yr”参数转换为yy变量?

您的程序中没有yy变量。只有yy虚拟参数。当你调用这个过程时,你使用所谓的命名参数。 This feature不是特定于Fortran的。但是,可选参数有什么问题?

和mm和dd一样。 FORTRAN是否关心变量的大小写敏感性?

Fortran是不区分大小写的语言。所以不,它不关心。


好的。我会尝试解释一些基本知识,因为在理解您的评论时遇到一些困难。 :)

当涉及到程序的Fortran术语从“普通”一个在某些方面有所不同:

  • 是很常见程序区分(执行一些任务,通过参数返回多个结果),并函数(在表达式中调用并返回表达式中使用的单个值),同时统称为它们子例程在Fortran中,我们有子程序函数统称为程序
  • 在调用过程时,通过参数传递一些信息。程序定义中出现的通常实体称为正式参数,程序调用中出现的实体称为实际参数在Fortran 正式论点被称为虚假论据请注意,因为通常虚拟参数被称为无意义参数,仅用于符合API,即Delphi中的EmptyParam

当过程被调用

(在Fortran标准方面被引用)的实际参数列表恒等式的 实际参数和该过程的伪参数之间的对应关系。

所以基本上对应关系是通过位置。某些语言(包括Fortran)也有能力通过关键字建立对应关系。长话短说:

这些关键字是虚拟参数名称,在第一个关键字参数后面必须没有进一步的位置参数 。 (c)Michael Metcalf,John Reid,Malcolm Cohen。现代Fortran解释。

详见Fortran语言标准(您可以抓取的Fortran 2008标准由链路的最后草案提供here副本),12.5.2实际参数,虚拟参数和参数关联。

所以关键字参数是被称为命名的参数在其他语言named parameters功能。

但是这个特性并不是唯一一个可以帮助程序员为调用过程编写简洁易读的代码而不会重载的函数。有些语言也有default arguments。 Fortran具有相似的功能:所谓的optional arguments。它看起来有点不同,但目标是一样的。

关键字参数通常与可选参数一起使用。例如,当您在参数列表中间省略可选参数时,应该使用关键字参数。

那么你的问题是什么?

+0

也称为“关键字”参数。请参阅http://en.wikipedia.org/wiki/Fortran_95_language_features#Arguments –

+0

我假设唯一的情况是,我们可以在虚拟参数的情况下谈论“变量”,这个参数可以通过值来调用,即真实的,可选的值:一个。 –

+0

哦好吧我明白了 - 所以关键字/虚拟参数是允许您指定要返回的可选参数的参数类型? – InquilineKea