子程序中声明了可变大小的数组为虚参,在主程序中的调用
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:34 编辑
子程序中
CHARACTER(LEN=100)::FNAME
改为
CHARACTER(LEN=*)::FNAME
REAL(KIND=8),ALLOCATABLE::TEMP_READTXT(:,:) !临时存储中间数据
改为
REAL(KIND=8)::TEMP_READTXT(:,:) !临时存储中间数据
子程序改为module中包含。主程序 use 该module
应该是在子程序中也声明数组长度的虚参,在子程序中分配好之后。然后在主程序中也要声明这个allocateble的数组。 现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和主程序。 楚香饭 发表于 2021-10-23 17:35
现阶段的 Fortran 程序,应该完全放弃外部子程序。所有子程序,全部放入module。
整个代码,只有 module 和 ...
那这样的话的好处是不是在主程序里就不用再声明那些数组变量了,直接就use
module就可以了,然后再书写其他的执行语句。 不是,module中虽然可以方便的在程序间共享数据,但容易造成命名污染。
在大型程序里,非常容易错乱。
应该合理的使用 module 共享数据。
但是,module 的好处有很多,你会慢慢体会到的。
对于你的这个问题,使用 module 的好处时,无需书写 interface。
关于 interface,请详见:
http://interface.w.fcode.cn/
页:
[1]