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