我在fortran中有一段代码。我将文件转储到子例程中。现在,我想从依赖于m的子例程中调用特定文件。例如,如果m = 3,则应读取filename(3),如果m = 6,则应读取filename(6)。这根本行不通。有人可以帮我解决这个问题吗?
Program main
implicit none
integer,parameter :: dp=kind(1.d0)
real,parameter::m=3
real(dp), dimension(:,:), allocatable :: s
call My_Reader(m)
allocate (s(m,m))
read(m*10,*) s
print*,s
SUBROUTINE My_Reader(m)
integer,parameter :: dp=kind(1.d0)
character (len=256)::filename(m)
integer , intent(in) :: m
filename(6)='C:\Users\spaudel\Documents\S6.txt'
filename(3)='C:\Users\spaudel\Documents\S3.txt'
OPEN (unit=m*10,FILE=fileName(m),status='old', action='read')
END SUBROUTINE My_Reader
在上面的程序中,它应该打印s(我的文件名是m * m矩阵),但有时却不打印。我正在使用gfortran。
文件名数组的长度为(m)
,这是你要读取哪个文件的伪参数。
因此,例如,如果you call My_Reader(3)
,它只会为初始化一个3元素数组filename
,那么当你向6th元素写入内容时,任何事情都会发生。
你可以filename
在子例程声明块中简单地确定数组的大小:
character(len=256) :: filename(6)
但是我会做一些完全不同的事情,我将使用aselect case
在子例程中分配文件名:
subroutine my_reader(m)
integer, intent(in) :: m
character(len=256) :: filename
select case (m)
case(3)
filename = 'C:\Users\spaudel\Documents\S3.txt'
case(6)
filename = 'C:\Users\spaudel\Documents\S6.txt'
case default
print *, 'incorrect selection of file number: `, m
STOP
end select
open(unit=m*10, file=filename, ...)
end subroutine my_reader
非常感谢chw21。有效。你为我节省了很多时间。小心。