openlang

Вызовы процедур между соседними подмодулями

Родительский модуль и каждый подмодуль находятся в отдельных файлах, как показано ниже. Может ли подмодуль D через use association вызвать процедуру из подмодуля C?

(File) module root_mod

|

|—(File) submodule C

| public module procedure taskC

|

|—(File) submodule D

use submodule C ? or use root_mod:submodule C

call taskC

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Они смогут вызывать друг друга после двух изменений:

    • Разместите интерфейсы дочерних процедур в родительском модуле

    • use не нужен, поскольку все дочерние подмодули имеют общего родителя

    Вот полный рабочий пример:

    demo.f90:

      module root_mod
      implicit none
      interface
      module subroutine routine_c()
      end subroutine routine_c
      module subroutine routine_d()
      end subroutine routine_d
      end interface
      end module root_mod
    
      program demo
      use root_mod
      implicit none
      call routine_d()
      end program demo

    c.f90:

      submodule(root_mod) c
      implicit none
      contains
      module subroutine routine_c
      print *, "hello from routine_c"
      end subroutine routine_c
      end submodule c

    d.f90:

      submodule(root_mod) d
      implicit none
      contains
      module subroutine routine_d
      print *, "hello from routine_d"
      call routine_c()
      end subroutine routine_d
      end submodule d
    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Соседние подмодули Fortran не знают о существовании друг друга. Однако иерархию подмодулей можно расширять настолько, насколько нужно:

      module root1
      implicit none
      ...
      end module root1
    
      submodule (root1) layer1
      implicit none
      interface
      module subroutine task1() ! visible to descendants of layer1 but not to root1
      end subroutine
      end interface
      end submodule layer1
    
      submodule (root1:layer1) layer2
      implicit none
      contains
      subroutine perform_task()
      call task1()
      end subroutine
      end submodule layer2
    
      submodule (root1:layer1) layer3
      implicit none
      contains
      subroutine perform_task()
      call task1()
      end subroutine
      end submodule layer3

    Обратите внимание, что perform_task определена и в layer2, и в layer3, поскольку соседние подмодули не видят объявлений друг друга.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как случайно выбирать варианты enum в GDScript на Godot 3.3, не перечисляя их?

    Вот объявление enum, которое я использую в GDScript: Хочу случайно выбирать вариант enum, не перечисляя все возможные вариант…

    Ответы 2Последняя активность gdscript
  2. Синтаксис остатка в Nim

    Как в Nim записать операцию взятия остатка? cell % 7 == 0 выдаёт undeclared identifier: '%' Ни поиск в Google, ни просмотр SO…

    Ответы 2Последняя активность nim
  3. Возврат результата из функции APL

    Как сделать так, чтобы моя функция возвращала значение после завершения выполнения? Например, у меня есть: ROUTINE N ? N ⍴ 12…

    Ответы 2Последняя активность apl