Fortran Coder

标题: 子程序中声明了可变大小的数组为虚参,在主程序中的调用 [打印本页]

作者: xxdw    时间: 2021-10-23 17:10
标题: 子程序中声明了可变大小的数组为虚参,在主程序中的调用
[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盘的盘符也变成了那个奇怪字符。

作者: 楚香饭    时间: 2021-10-23 17:33
本帖最后由 楚香饭 于 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

作者: xxdw    时间: 2021-10-23 17:34
应该是在子程序中也声明数组长度的虚参,在子程序中分配好之后。然后在主程序中也要声明这个allocateble的数组。
作者: 楚香饭    时间: 2021-10-23 17:35
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和主程序。
作者: xxdw    时间: 2021-10-24 13:38
楚香饭 发表于 2021-10-23 17:35
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和 ...

那这样的话的好处是不是在主程序里就不用再声明那些数组变量了,直接就use
module就可以了,然后再书写其他的执行语句。
作者: fcode    时间: 2021-10-24 22:47
不是,module中虽然可以方便的在程序间共享数据,但容易造成命名污染。
在大型程序里,非常容易错乱。
应该合理的使用 module 共享数据。

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

对于你的这个问题,使用 module 的好处时,无需书写 interface。
关于 interface,请详见:
http://interface.w.fcode.cn/




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2