0

Мне нужно написать подпрограмму в Fortran 77 (я использую Intel Fortran), которая считывает измеренные значения из текстового файла и сохраняет их в матрице.Динамический массив в Fortran 77

Поскольку количество измеренных значений всегда является переменной, я должен динамически выделять матрицу.

Я знаю, что динамическое распределение возможно только от Fortran 90, но в то время у людей были те же проблемы, поэтому это также возможно. Как вы продолжите?

Я не хочу оставлять слишком много места для матрицы, потому что метод для меня непрактичен.

+0

http://stackoverflow.com/questions/3834985/dynamic-memory-allocation-in-fortran77 –

+0

Не записывайте Fortran 77 в 2016 году, особенно если вам требуется динамическое распределение памяти, это просто не стоит. Если вы не можете использовать старый Fortran 90, выделите материал в C и передайте его в подпрограммы Fortran. –

+1

Есть причины, по которым использовать FORTRAN 77 в устаревших системах. Нет причин использовать FORTRAN 77 при использовании Intel Fortran. –

ответ

2

Если вы действительно ограничены Fortran 77, вы не выполняете динамическое распределение. Вместо этого объявите массив, который больше, чем вы думаете, что вам, вероятно, понадобится, без его слишком большой, чтобы программа не запускалась в вашей целевой системе. Затем сохраните свои значения в этом большом массиве, отдельно отслеживая количество элементов большого массива, которые вы используете. Если ваш размер массива не был достаточно большим, сообщите об этом пользователю и завершите работу программы.

Люди обнаружили, что динамическое распределение в Fortran 77 очень ограничительное, поэтому они часто прибегают к использованию нестандартных языковых расширений. Если вы решите пойти по пути расширения языка, то в наши дни лучшим расширением для Fortran 77 для использования в этой ситуации является функция allocatable array, представленная с Fortran 90. Я считаю справедливым сказать, что все активно поддерживаемые компиляторы, которые могут дескриптор Fortran 77 также будет обрабатывать распределенные массивы Fortran 90 (а затем некоторые).

+0

Спасибо ЯнХ. Я уже думал, что статически распределять стати проще. Я попробую в обоих направлениях, но наклонись к статике. – ingenium

0

Как отмечают многие люди, вам не нужно придерживаться Fortran77, даже если многое из того, что уже написано, совместимо с Fortran77. Даже те немногие функции, которые были удалены в Fortran 95 See Wikipedia for a list, ваш компилятор, вероятно, все равно будет работать нормально, если вы не переходите от фиксированной формы к свободной форме в том же файле.

Pre-F90, то, что люди, вероятно, сделают, это объявить массивы, которые (надеются быть) достаточно большими для любого варианта использования, а затем использовать только первые элементы этого массива.

Одна вещь, о которой я не уверен, но которая может быть полезна, - это изменение сферы. Краткий пример:

 subroutine main(n) 
      implicit none 
      integer n 
      integer a(n) 
      print*, "Please enter the ", n, " numbers" 
      read*, a 
      print*, "Sum is ", sum(a) 
     end subroutine main 

     program dynamic 
      implicit none 
      integer n 
      print*, "Enter size of array:" 
      read*, n 
      call main(n) 
     end program dynamic 

Я хотел бы знать, будет ли это Fortran77 требований. Честно говоря, я не знаю. @francescalus убедил меня, что это не так.

+0

Для вашего заключительного абзаца: это не F77. – francescalus

+0

Я получаю смешанные сообщения. Oracle, похоже, считает, что настраиваемые локальные массивы соответствуют требованиям F77: https://docs.oracle.com/cd/E19957-01/805-4939/z40007367199/index.html, тогда как другие ресурсы утверждают, что настраиваемые массивы могут быть только фиктивными аргументами, не локальные массивы, например здесь: https://www.obliquity.com/computer/fortran/procedure.html – chw21

+1

В документации Oracle обратите внимание на «локальный массив @». То, что «@» означает нестандартное расширение. – francescalus

Смежные вопросы