Fortran Coder

查看: 10551|回复: 5
打印 上一主题 下一主题

[子程序] 子程序中声明了可变大小的数组为虚参,在主程序中的调用

[复制链接]

24

帖子

7

主题

0

精华

熟手

F 币
143 元
贡献
88 点
跳转到指定楼层
楼主
发表于 2021-10-23 17:10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
SUBROUTINE xdw_READTXT(FID,FNAME,SKIPHEAD,TEMP_READTXT)
    USE SET_PARAMETER
    IMPLICIT NONE

    INTEGER          ::I = 1,J
    INTEGER          ::FID
    CHARACTER(LEN=100)::FNAME
    REAL(KIND=8),ALLOCATABLE::TEMP_READTXT(:,:) !临时存储中间数据
    INTEGER::HERE_STAT
    INTEGER::SKIPHEAD

这是子程序的片段

在主程序总调用:
[Fortran] 纯文本查看 复制代码
 real*8,ALLOCATABLE::sp(:,:),z(:,:)
        real*8,ALLOCATABLE::q(:,:),t(:,:)
        allocate(sp(360,720),STAT = AOS)
        allocate(z(360,720),STAT = AOS)
        allocate(t(259200,720),STAT = AOS)
        allocate(q(259200,720),STAT = AOS)
        call xdw_READTXT(11,'D:\Temp\2019010100sp_nofirst.txt',0,sp)
        call xdw_READTXT(11,'D:\Temp\2019010100z_nofirst.txt',0,z)
        call xdw_READTXT(11,"‪D:\Temp\2019010100q_nofirst.txt",0,q)
        call xdw_READTXT(11,'‪D:\Temp\2019010100t_nofirst.txt',0,t)


报错如下
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(27): error #7938: Character length argument mismatch.   ['D:\Temp\2019010100sp_nofirst.txt']
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(27): error #8055: The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute. Required explicit interface is missing from original source.   [SP]
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(28): error #7938: Character length argument mismatch.   ['D:\Temp\2019010100z_nofirst.txt']
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(28): error #8055: The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute. Required explicit interface is missing from original source.   [Z]
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(29): error #7938: Character length argument mismatch.   ['鈥狣:\Temp\2019010100q_nofirst.txt']
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(29): error #8055: The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute. Required explicit interface is missing from original source.   [Q]
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(30): error #7938: Character length argument mismatch.   ['鈥狣:\Temp\2019010100t_nofirst.txt']
D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90(30): error #8055: The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute. Required explicit interface is missing from original source.   [T]
compilation aborted for D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90 (code 1)

还有D盘的盘符也变成了那个奇怪字符。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2021-10-23 17:33:21 | 只看该作者
本帖最后由 楚香饭 于 2021-10-23 17:34 编辑

子程序中
CHARACTER(LEN=100)::FNAME
改为
CHARACTER(LEN=*)::FNAME

REAL(KIND=8),ALLOCATABLE::TEMP_READTXT(:,:) !临时存储中间数据

改为
REAL(KIND=8)::TEMP_READTXT(:,:) !临时存储中间数据

子程序改为module中包含。主程序 use 该module

24

帖子

7

主题

0

精华

熟手

F 币
143 元
贡献
88 点
板凳
 楼主| 发表于 2021-10-23 17:34:16 | 只看该作者
应该是在子程序中也声明数组长度的虚参,在子程序中分配好之后。然后在主程序中也要声明这个allocateble的数组。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2021-10-23 17:35:59 | 只看该作者
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和主程序。

24

帖子

7

主题

0

精华

熟手

F 币
143 元
贡献
88 点
5#
 楼主| 发表于 2021-10-24 13:38:29 | 只看该作者
楚香饭 发表于 2021-10-23 17:35
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和 ...

那这样的话的好处是不是在主程序里就不用再声明那些数组变量了,直接就use
module就可以了,然后再书写其他的执行语句。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2021-10-24 22:47:37 | 只看该作者
不是,module中虽然可以方便的在程序间共享数据,但容易造成命名污染。
在大型程序里,非常容易错乱。
应该合理的使用 module 共享数据。

但是,module 的好处有很多,你会慢慢体会到的。

对于你的这个问题,使用 module 的好处时,无需书写 interface。
关于 interface,请详见:
http://interface.w.fcode.cn/
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-7 08:08

Powered by Tencent X3.4

© 2013-2024 Tencent

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