Fortran子例程变量作用域

时间:2019-11-27 18:26:00

标签: fortran fortran90

我才刚刚开始使用Fortran,并编写了一个子例程以将给定文件读取到可分配数组中。为此,我首先打开文件以计算文件中的行数,为数组分配适当的大小,倒带文件,然后再次通读以填充数组。

SUBROUTINE read_file(iunit, inFile, data_arry, ncols)
    INTEGER :: nlines = 0
    INTEGER :: jj, io, iunit, ncols
    CHARACTER(LEN=*) :: inFile
    REAL(8), DIMENSION(:,:), ALLOCATABLE :: data_arry

    OPEN(UNIT=iunit, FILE=inFile) ! Open the file

    ! Count the number of lines in the file for array allocation
    DO
        READ(iunit,*,IOSTAT=io)
        IF(io/=0) EXIT
        nlines = nlines + 1
    ENDDO

    WRITE(*,*) nlines ! Debug check
    REWIND(iunit) ! Start at the beginning of the file

    ALLOCATE(data_arry(nlines,ncols)) ! Allocate necessary space

    ! fill array
    DO jj = 1,nlines
        READ(iunit,*) data_arry(jj,:)
    ENDDO
    CLOSE(iunit)

    ! Check array
    DO ii = 1,nlines
        WRITE(*,*) data(ii,:)
    ENDDO

END SUBROUTINE read_file

我遇到的问题是,我需要读取多个文件,并且当我多次调用此子例程时,变量nlines不会像我告诉的那样重置为0。因此,它的值只是前一个文件的行数和新文件的行数的总和,当我执行第二个READ循环时,我得到文件结尾错误。我可以使用另一个IOSTAT来解决这个问题,但这对我来说似乎是一个临时的解决方法,我宁愿做对了。再说一次,我是FORTRAN的新手,但据我了解,子例程中的变量是全局变量,因此,如果我没有每次都将nlines初始化为零,那么出现此问题就很有意义。我尝试将变量作为输入,但遇到有关内存位置的其他错误。我也尝试过使其成为函数而不是子例程,但是问题仍然存在。这可能是一个容易解决的问题,但让我毫无头绪。

我正在读取的两个文件的格式如下。

...
16  0.0454916279274181  0.3572201583376681
17  0.0445905581637566  -0.4022701579639916
18  0.0445905581637566  0.4022701579639916
19  0.0435837245293235  -0.4463660172534641
20  0.0435837245293235  0.4463660172534641
...

...
1444.3625975724958, 71.46169492954482
1444.3625975724958, 69.59465868490668
1444.3625975724958, 67.72762244026855
1444.3625975724958, 65.86058619563042
1439.8112383739438, 63.99354995099228
1439.8112383739438, 62.126513706354146
...

0 个答案:

没有答案