Warm tip: This article is reproduced from serverfault.com, please click

fortran-根据输入从子例程读取不同的文件

(fortran - reading different files from the subroutine depending on the input)

发布于 2020-11-28 02:52:29

我在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。

Questioner
user13826174
Viewed
0
chw21 2020-11-28 13:24:54

文件名数组的长度为(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