Fortran Coder

查看: 2337|回复: 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盘的盘符也变成了那个奇怪字符。

637

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
350 元
贡献
168 点

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

发表于 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的数组。

637

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
350 元
贡献
168 点

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

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

24

帖子

7

主题

0

精华

熟手

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

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

1762

帖子

13

主题

5

精华

论坛跑堂

臭石头雪球

F 币
482 元
贡献
184 点

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

发表于 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, 2022-7-5 21:42

Powered by Tencent X3.4

© 2013-2022 Tencent

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