根据输入从子程序中读取不同的文件

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