xxdw 发表于 2021-10-23 17:10:15

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

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
这是子程序的片段

在主程序总调用:
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.   
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.   
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.   
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.   
compilation aborted for D:\01 AOD\AODFortran\xdw_VIpressure\xdw_VIpressure\MAIN.f90 (code 1)

还有D盘的盘符也变成了那个奇怪字符。

楚香饭 发表于 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

xxdw 发表于 2021-10-23 17:34:16

应该是在子程序中也声明数组长度的虚参,在子程序中分配好之后。然后在主程序中也要声明这个allocateble的数组。

楚香饭 发表于 2021-10-23 17:35:59

现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和主程序。

xxdw 发表于 2021-10-24 13:38:29

楚香饭 发表于 2021-10-23 17:35
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和 ...

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

fcode 发表于 2021-10-24 22:47:37

不是,module中虽然可以方便的在程序间共享数据,但容易造成命名污染。
在大型程序里,非常容易错乱。
应该合理的使用 module 共享数据。

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

对于你的这个问题,使用 module 的好处时,无需书写 interface。
关于 interface,请详见:
http://interface.w.fcode.cn/
页: [1]
查看完整版本: 子程序中声明了可变大小的数组为虚参,在主程序中的调用