Если myMatrix
- это несохраненная , локальная переменная подпрограммы A
, то необходимо будет пересчитывать ее значения для каждой записи подпрограммы: несохраненная локальная переменные становятся неопределенными, когда подпрограмма завершает выполнение.
Однако есть несколько подходов к повторному использованию переменной:
- сделать ее сохраненной локальной переменной: сохраненные локальные переменные сохраняют свое определение
- имеют его как фиктивный аргумент, а не локальную переменную (ассоциация аргументов): его определение исходит от вызывающего
- имеет его как некоторую другую форму нелокальной переменная (другие формы ассоциации ): ее определение происходит из другого места
Если это сохраненная переменная, вычислить ее при первой записи подпрограммы и сохранить ее определение при последующих вызывает:
subroutine A
<declaration>, save :: mymatrix
logical, save :: first_entry = .TRUE.
if (first_entry) then
! set up mymatrix
first_entry = .FALSE.
end if
! ...
end subroutine A
Вы можете сделать то же самое с mymatrix
переменной модуля / хоста. Вы можете использовать сохраненный индикатор first_entry
или положиться на пользователя (как в evets answer ), имеющем дополнительный шаг настройки:
module A_module
use constants
<declaration> myMatrix ! Example with host association, automatically saved
contains
subroutine A
! myMatrix is reused, either set up by a distinct call or on first entry
! other steps that use myMatrix
end subroutine A
end module A_module
Или вы можете использовать переменную как фиктивный аргумент:
mymatrix_actual = ...
do k = 1,10000
call A(mymatrix_actual) ! A now has the dummy variable
end do