Fortran Coder

查看: 9334|回复: 2
打印 上一主题 下一主题

[子程序] non-keyword arguments are invalid after keyword arguments have been encountered

[复制链接]

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

跳转到指定楼层
楼主
发表于 2018-1-15 19:50:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神,您们好!
在下有一个关于non-keyword arguments are invalid after keyword arguments have been encountered的报错问题需要你们的帮助。
我在编译一个模式时,其中主程序有一段代码是这样的:
[Fortran] 纯文本查看 复制代码
type (rttov_emis_atlas_data)          :: atlas   ! 这个派生结构体已经在前面定义好了
... ...
        call rttov_setup_emis_atlas(                      &
            errorstatus,                                   & ! out
            opts(inst),                                    & ! in
            grid%start_month,                              & ! in
            atlas_type = 1,                                & ! in, new for RTTOV V12
            atlas ,                                       & ! inout, new for RTTOV V12
            atlas_id = rttov_emis_atlas_mw,                & ! in, optional, new for RTTOV V12
            path = trim(atlas_path))!,                       & ! in, optional

         call rttov_get_emis(                    &
            errorstatus,                         & ! out
            opts(inst),                          & ! in
            chanprof,                            & ! in
            profiles,                            & ! in
            coefs(inst),                         & ! in
            atlas,                               & ! in, new for RTTOV V12
            emissivity = emissivity(:)%emis_in)    ! out

         call rttov_deallocate_emis_atlas(atlas)   ! for RTTOV V12
... ...
下面是相应的子程序rttov_setup_emis_atlas截取的部分:
[Fortran] 纯文本查看 复制代码
SUBROUTINE rttov_setup_emis_atlas(          &
                err,                        &! out
                opts,                       &! in
                imonth,                     &! in
                atlas_type,                 &! in
                atlas,                      &! inout
                atlas_id,                   &! in, optional
                path,                       &! in, optional
                coefs,                      &! in, optional
                ir_atlas_read_std,          &! in, optional
                ir_atlas_ang_corr,          &! in, optional
                year)                        ! in, optional
  IMPLICIT NONE
  INTEGER(KIND=jpim),          INTENT(OUT)             :: err
  TYPE(rttov_options),         INTENT(IN)              :: opts
  INTEGER(KIND=jpim),          INTENT(IN)              :: imonth
  INTEGER(KIND=jpim),          INTENT(IN)              :: atlas_type
  TYPE(rttov_emis_atlas_data), INTENT(INOUT)           :: atlas
  INTEGER(KIND=jpim),          INTENT(IN),    OPTIONAL :: atlas_id
  CHARACTER(LEN=*),            INTENT(IN),    OPTIONAL :: path
  TYPE(rttov_coefs),           INTENT(IN),    OPTIONAL :: coefs
  LOGICAL(KIND=jplm),          INTENT(IN),    OPTIONAL :: ir_atlas_read_std
  LOGICAL(KIND=jplm),          INTENT(IN),    OPTIONAL :: ir_atlas_ang_corr
  INTEGER(KIND=jpim),          INTENT(IN),    OPTIONAL :: year

下面是子程序rttov_get_emis截取的部分:
[Fortran] 纯文本查看 复制代码
SUBROUTINE rttov_get_emis(      &
                err,            &! out
                opts,           &! in
                chanprof,       &! in
                profiles,       &! in
                coefs,          &! in
                atlas,          &! in
                emissivity,     &! out
                emis_std,       &! out, optional (IR atlases, TELSEM2)
                emis_cov,       &! out, optional (TELSEM2)
                emis_flag,      &! out, optional (IR atlases)
                resolution)      ! in,  optional (TELSEM2)
  IMPLICIT NONE
  INTEGER(KIND=jpim),          INTENT(OUT)           :: err
  TYPE(rttov_options),         INTENT(IN)            :: opts
  TYPE(rttov_chanprof),        INTENT(IN)            :: chanprof(:)
  TYPE(rttov_profile),         INTENT(IN)            :: profiles(:)
  TYPE(rttov_coefs),           INTENT(IN)            :: coefs
  TYPE(rttov_emis_atlas_data), INTENT(IN)            :: atlas
  REAL(KIND=jprb),             INTENT(OUT)           :: emissivity(SIZE(chanprof))
  REAL(KIND=jprb),             INTENT(OUT), OPTIONAL :: emis_std(SIZE(chanprof))
  ! emis_cov dims are (nprofs, nchans, nchans) where nchans is the maximum # channels per profile
  REAL(KIND=jprb),             INTENT(OUT), OPTIONAL :: emis_cov(:,:,:)
  INTEGER(KIND=jpim),          INTENT(OUT), OPTIONAL :: emis_flag(SIZE(chanprof))
  REAL(KIND=jprb),             INTENT(IN),  OPTIONAL :: resolution

下面是子程序rttov_deallocate_emis_atlas截取的部分:
[Fortran] 纯文本查看 复制代码
SUBROUTINE rttov_deallocate_emis_atlas(atlas)
  IMPLICIT NONE
  TYPE(rttov_emis_atlas_data), INTENT(INOUT) :: atlas


然后每次编译时,都会在主程序调用子程序rttov_setup_emis_atlas时报错:
non-keyword arguments are invalid after keyword arguments have been encountered [atlas]
而我把它改成:
atlas = atlas
时,它就不报错。
所以我的问题是,为什么同样在主程序中调用子程序都用到atlas,却只在调用rttov_setup_emis_atlas时报这种错误,而在调用rttov_get_emis和rttov_deallocate_emis_atlas时,写成atlas却不报错?
希望大神们能提供您的建议,谢谢大家~
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

235

帖子

0

主题

0

精华

版主

World Analyser

F 币
630 元
贡献
464 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2018-1-16 08:54:59 | 只看该作者
本帖最后由 kyra 于 2018-1-16 09:02 编辑

call sub(a,b,c,d,e,f)
subroutine sub(AI,BI,CI,DI,EI,FI)
调用一个函数,有一个参数列表。
一旦参数列表里有一个关键字了,比如
call sub(a,b,c,DI=d,e,f)

那么,该关键字后面的参数,也必须带关键字。也就是上面的写法是错误的,必须写成
call sub(a,b,c,DI=d,EI=e,FI=f)
或者调换顺序,写成
call sub(a,b,c,EI=e,FI=f,DI=d)

这是一个逻辑问题,而不是程序问题。
生活中也有类似的情况,假象你手上有一个“学生名单”,但你以前从来没有见过他们,是第一次,如果学生按照名单的顺序排好队,你不需要让每个学生报自己的名字,你就可以按照顺序去对应。
一旦有一个学生开始“插队”了,你必须让他报出自己的名字,你才知道他是谁,对吧?而且后面的学生,已经打破了“学生名单”上的顺序,也必须每个学生报自己的名字,你才知道他们分别是谁,对吧?

“学生名单” : 虚参
学生顺序:实参
报自己名:关键字参数,如,DI = d
你:编译器

同样的问题,也适合于编译器自带的语句,比如 Open,Read,这些有子句的语句。
比如:
Open( 12 , File = "name.txt" )
Read( 12 , fmt = "(a)" ) str
都是正确的,但
Read( Unit = 12 , "(a)" ) str 则不正确,必须写成
Read( Unit = 12 , fmt = "(a)" ) str

15

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
51 点

规矩勋章

板凳
 楼主| 发表于 2018-1-18 18:21:50 | 只看该作者
kyra 发表于 2018-1-16 08:54
call sub(a,b,c,d,e,f)
subroutine sub(AI,BI,CI,DI,EI,FI)
调用一个函数,有一个参数列表。

这个回答太给力了!现在我明白这个逻辑问题了,太感谢您了~很赞!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-20 07:09

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表