Fortran Coder

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

[子程序] 子程序中定义的一个参数传递时出现问题

[复制链接]

13

帖子

5

主题

0

精华

入门

F 币
81 元
贡献
48 点
跳转到指定楼层
楼主
发表于 2020-3-7 23:17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kyra 于 2020-3-8 08:59 编辑

[Fortran] 纯文本查看 复制代码
SUBROUTINE zdf_phy1(kt, wp, jpjm1, jpkm1, jpi, jpj, jpk, avt, avm, avm_k, avt_k)
                 INTEGER, INTENT(in) ::   kt  
                 INTEGER, INTENT(in) :: wp 
                 INTEGER, INTENT(in) ::   jpjm1, jpkm1 
                 INTEGER, INTENT(in)  ::   jpi, jpj, jpk
                 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   avt, avm
                 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   avm_k , avt_k  
                 !
                 avt(:,:,2:jpkm1) = avt_k(:,:,2:jpkm1)
                avm(:,:,2:jpkm1) = avm_k(:,:,2:jpkm1)
END SUBROUTINE zdf_phy1


我在上面的子程序中定义了一个wp,它在另一个module中被定义为一个常数:
[Fortran] 纯文本查看 复制代码
MODULE par_kind
   INTEGER, PUBLIC, PARAMETER ::   dp = SELECTED_REAL_KIND(12,307)   
   INTEGER, PUBLIC, PARAMETER ::   wp = dp 


我在主程序中调用了最上面那个SUBROUTINE,同时在主程序的MODULE中调用了下面这个wp,希望将wp的值传递给主程序中,但是编译却没有通过,错误信息为:
REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   avt, avm
        1
Error: Parameter ‘wp’ at (1) has not been declared or is a variable, which does not reduce to a constant expression

让我困惑的是例如最上方SUBROUTINE中的jpjm1,jpi等变量我采用的也是相同的方法并且可以编译通过,只不过它们不是常量。
请问数据是否是常数对参数的传递会有影响吗?还是因为别的原因?我是初学者,有些地方表述不清请见谅。。


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

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

QQ
沙发
发表于 2020-3-8 09:02:20 | 只看该作者
本帖最后由 kyra 于 2020-3-8 09:03 编辑

如果你用一个“量”来定义一个变量的kind值,那么这个“量”只能是常量,而不能是变量。
而虚参,被认为是变量,不是常量。

所以,你只需要子程序也use par_kind 就可以使用常量wp了,无需(也不能)虚参传递。

13

帖子

5

主题

0

精华

入门

F 币
81 元
贡献
48 点
板凳
 楼主| 发表于 2020-3-8 11:48:28 | 只看该作者
kyra 发表于 2020-3-8 09:02
如果你用一个“量”来定义一个变量的kind值,那么这个“量”只能是常量,而不能是变量。
而虚参,被认为是 ...

感谢版主的解答,明白了!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-23 23:52

Powered by Tencent X3.4

© 2013-2024 Tencent

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