Являются ли абстрактные фиктивные интерфейсы рекомендуемой привычкой программирования на Фортране? - PullRequest
4 голосов
/ 01 ноября 2019

В моем коде у меня есть разные подпрограммы, которые должны выполняться в определенном порядке, в зависимости от того, какие входные данные указывает пользователь. Например, у нас может быть

  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 

Он работает, однако, я боюсь, может ли это привести к потенциальным проблемам / опасности. Мой вопрос действительно сводится к последствиям использования такой практики программирования на Фортране.

...