Решение 1
Вам не нужно ничего хранить, если вы сделаете LocalSub
внутренним для H
:
subroutine H(sub)
external:: sub
call G(LocalSub)
contains
subroutine LocalSub
message='Good Afternoon'
call G(sub)
end subroutine LocalSub
end subroutine H
Требуется Фортран 2008.
С некоторой очисткой, отступом для удобства чтения, удалением уродливых внешних элементов с использованием абстрактного интерфейса (Fortran 2003, но external
можно избежать даже в Fortran 90 с использованием интерфейсных блоков) код выглядит следующим образом:
module G_MOD
implicit none
character(len=30)::message='Good Morning'
abstract interface
subroutine sub_interface
end subroutine
end interface
contains
subroutine G(Sub)
procedure(sub_interface) :: sub
call Sub
end subroutine G
end module G_MOD
module H_MOD
use G_MOD
implicit none
contains
subroutine H(sub)
procedure(sub_interface) :: sub
call G(LocalSub)
contains
subroutine LocalSub
message='Good Afternoon'
call G(sub)
end subroutine LocalSub
end subroutine H
end module H_MOD
program test
use H_MOD
implicit none
call H(MySub)
contains
subroutine MySub
use G_MOD,only:message
write(*,*)trim(Message)
end subroutine MySub
end program test
Решение 2
Если вы действительно хотите сохранить ссылку на процедуру в модуле, это возможно, но помните, что глобальные переменные УЖАСНЫ. Что делать, если вы хотите сделать несколько вызовов оптимизации параллельно?
Таким образом, вы можете хранить адрес (не имя) процедуры в файле procedure pointer
. Для этого требуется Fortran 2003. Минимальное изменение вашего кода
module H_MOD
use G_MOD
implicit none
procedure, pointer :: stored_sub => null()
contains
subroutine H(sub)
external:: sub
stored_sub => sub
call G(LocalSub)
end subroutine H
subroutine LocalSub
message='Good Afternoon'
call G(stored_sub)
end subroutine LocalSub
end module H_MOD
но гораздо лучший современный код:
module G_MOD
implicit none
character(len=30)::message='Good Morning'
abstract interface
subroutine sub_interface
end subroutine
end interface
contains
subroutine G(Sub)
procedure(sub_interface) :: sub
call Sub
end subroutine G
end module G_MOD
module H_MOD
use G_MOD
implicit none
procedure(sub_interface), pointer :: stored_sub => null()
contains
subroutine H(sub)
procedure(sub_interface) :: sub
stored_sub => sub
call G(LocalSub)
end subroutine H
subroutine LocalSub
message='Good Afternoon'
call G(stored_sub)
end subroutine LocalSub
end module H_MOD
module MySub_module
contains
subroutine MySub
use G_MOD,only:message
write(*,*)trim(Message)
end subroutine MySub
end module MySub_module
program test
use H_MOD
use MySub_module
implicit none
call H(MySub)
end program test
Тем не менее, я определенно предпочитаю вариант с внутренней процедурой.
И помните, используйте отступы, это необходимо для читаемого кода.
person
Vladimir F
schedule
12.06.2017