Как обрабатывать глобально распределяемые переменные Fortran в модуле через подпрограммы - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий модуль с размещаемой переменной, которая определена в модуле, размещена в подпрограмме, а затем также используется во второй подпрограмме, вызываемой первой подпрограммой.В этой ситуации я должен передать переменную второй подпрограмме и объявить INTENT(inout)?Или, поскольку это глобальная переменная, ее не нужно передавать в качестве аргумента?

MODULE test

  IMPLICIT NONE
  SAVE

  REAL,ALLOCATABLE,DIMENSION(:,:,:) :: total

CONTAINS

  !--- 1st subroutine
  SUBROUTINE my_subr1(n,m,z)
    IMPLICIT NONE
    INTEGER,INTENT(in) :: n,m,z
    ALLOCATE(total (n,m,z))
    total=.9
    CALL my_subr2(n)

  END SUBROUTINE my_subr1

  !-- 2nd subroutine
  SUBROUTINE my_subr2(n)
    IMPLICIT NONE
    INTEGER,INTENT(in) :: n

    total(n,:,:)=total(n-1,:,:)
  END SUBROUTINE my_subr2
END MODULE test

1 Ответ

0 голосов
/ 25 февраля 2019

Должен ли я передать переменную во вторую подпрограмму и объявить INTENT(inout)?

Нет, нет.Любая переменная, декалированная в теле модуля, имеет атрибут save по умолчанию.Тем не менее, вы должны убедиться, что вторая подпрограмма вызывается только после того, как была выполнена первая, иначе программа завершится ошибкой, поскольку total еще не инициализирован.

Все функции и подпрограммы, объявленные в модуле, будутиметь доступ к total ассоциацией хоста.


Кстати, в вашем коде есть некоторые проблемы, которые вы должны решить, как упомянуто @PierredeBuyl в комментариях:

  • Переменные, объявленные в теле модуля, сохраняются по умолчанию;Вы должны удалить оператор SAVE.
  • Процедуры, объявленные в модуле, наследуют директиву IMPLICIT из области видимости модуля, нет необходимости переопределять ее в подпрограмме, если вы не измените ее.
  • Вам не хватает объявления аргументов в my_subr1.
...