根据输入从子程序中读取不同的文件
reading different files from the subroutine depending on the input
我有一段 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)
,这是您要读取的文件的虚拟参数。
因此,例如,如果您 call My_Reader(3)
,它只会为 filename
初始化一个 3 元素数组,然后当您向第 6 个元素写入内容时,任何事情都可能发生。
您可以简单地固定子程序声明块中 filename
数组的大小:
character(len=256) :: filename(6)
但我会做一些完全不同的事情,我会使用 select 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
我有一段 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)
,这是您要读取的文件的虚拟参数。
因此,例如,如果您 call My_Reader(3)
,它只会为 filename
初始化一个 3 元素数组,然后当您向第 6 个元素写入内容时,任何事情都可能发生。
您可以简单地固定子程序声明块中 filename
数组的大小:
character(len=256) :: filename(6)
但我会做一些完全不同的事情,我会使用 select 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