Fortran Coder
标题: non-keyword arguments are invalid after keyword arguments have been encountered [打印本页]
作者: 好好干 时间: 2018-1-15 19:50
标题: non-keyword arguments are invalid after keyword arguments have been encountered
各位大神,您们好!
在下有一个关于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却不报错?
希望大神们能提供您的建议,谢谢大家~
作者: kyra 时间: 2018-1-16 08:54
本帖最后由 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
作者: 好好干 时间: 2018-1-18 18:21
kyra 发表于 2018-1-16 08:54
call sub(a,b,c,d,e,f)
subroutine sub(AI,BI,CI,DI,EI,FI)
调用一个函数,有一个参数列表。
这个回答太给力了!现在我明白这个逻辑问题了,太感谢您了~很赞!
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) |
Powered by Discuz! X3.2 |