Fortran 77 Задаване на размера на масива по време на изпълнение

По принцип се стремя да въведа двойки X,Y, прочетени от файл, в масиви с дължина n, където n е броят на редовете (и следователно двойките x,y) във файла. За съжаление всичките ми опити да определя дължината на файла и след това да го използвам за задаване на размера на масива бяха неуспешни. Как мога да постигна това във Fortran 77? Надявам се, че не пропускам нещо очевидно, повече съм свикнал с Python и Java, където това е доста тривиално.

PS. Преди да попитам това, се огледах и изглеждаше, че общото усещане беше, че просто задавате размера по-голям, отколкото бихте очаквали да бъде, но това изглежда много разточително и неефективно.


person VincentAlpha    schedule 30.04.2013    source източник


Отговори (1)


Решението е да използвате Fortran 90/95/2003/2008, който има необходимите възможности за вашия проблем, докато FORTRAN 77 не. Прочетете файла веднъж, за да определите броя на елементите с данни. Превъртете файла назад. Разпределете масива с необходимата дължина. Прочетете файла отново, четейки в масивите.

Използване на Fortran 2003/2008 (нетествано):

use iso_fortran_env

real :: xtmp, ytmp
real, dimension (:), allocatable :: x, y
integer :: i, n
integer :: Read_Code

open (unit=75, file=...)

n = 0
LengthLoop: do

   read ( 75, *, iostat=Read_Code)  xtmp, ytmp

   if ( Read_Code /= 0 ) then
      if ( Read_Code == iostat_end ) then
         exit LengthLoop
      else
         write ( *, '( / "read error: ", I0 )' )  Read_Code
         stop
      end if
   end if

   n = n + 1

end do LengthLoop

allocate (x(n))
allocate (y(n))

rewind (75)

do i=1, n
   read (75, *) x(i), y(i)
end do

close (75)
person M. S. B.    schedule 01.05.2013