В моем коде у меня есть разные подпрограммы, которые должны выполняться в определенном порядке, в зависимости от того, какие входные данные указывает пользователь. Например, у нас может быть
do TIMELOOP = 1, n
if(userinput_1) then
call routine_1(..)
call routine_2 (..)
etc etc
elseif (userinput_2) then
call routine_3(....)
call routine_1(....)
endif
enddo
Решение, которое я использовал, чтобы избежать всех этих ifs, заключается в использовании массива указателей на процедуры
type ptr_proc
procedure(A_INT), pointer :: proc
end type
type(ptr_proc), allocatable :: ptr(:)
Проблема в том, что Fortranтребует, чтобы указатель proc
всегда указывал на процедуры с тем же интерфейсом, который определен как A_INT
. Я никак не могу это сделать, так как рутинная_1, рутинная_2 и т. Д. Очень разные.
Я преодолел это, определив следующий магический интерфейс
abstract interface
subroutine A_INT
end subroutine
end interface
Другими словами, у него пустой интерфейс. Подпрограммы с пустыми интерфейсами в основном являются обертками для рутины_1, рутины_2 и т. Д.
Так, в качестве примера, обертка для рутины_1 может быть:
subroutine WRAP_ROUT_1
use MOD_FOR_ROUT_1
call ROUTINE_1( ...) ! - I insert the (inputs, outputs) here which I have from the use statement
end subroutine
Затем во время инициализации я указываю все своиуказатели на соответствующие процедуры оболочки.
if(userinput_1) then
ptr(1)% proc => WRAP_ROUT_1
ptr(2)% proc => WRAP_ROUT_2
etc etc.
elseif ...
endif
Тогда мой цикл времени выглядит как
do TIMELOOP = 1, n
do i = 1 , size(ptr)
call ptr(i)% PROC
enddo
enddo
Он работает, однако, я боюсь, может ли это привести к потенциальным проблемам / опасности. Мой вопрос действительно сводится к последствиям использования такой практики программирования на Фортране.