Как могут отдельные модули, каждый из которых имеет свои производные типы и связанные процедуры, использовать друг друга? - PullRequest
0 голосов
/ 08 сентября 2018

Модули программы свободной формы используют иерархию, начинающуюся с Global_Module. Глобальный затем используется как Channel_Module, так и Mode_Module, и это прекрасно работает. Все модули используют IMPLICIT NONE. Я выделил приведенную ниже ошибку компилятора в оператор USE Channel_Module в рамках процедуры инициализации, связанной с типом режима в Modes_Module.

Я уверен, что DT предназначены для обмена данными друг с другом через связанные процедуры, но по неизвестной причине это не работает в этом случае. И Global, и Channel компилируются с 0 ошибками и предупреждениями. И Channel, и Modes ранее обращались к данным от своего глобального родителя просто отлично. Все публично. Однако теперь мне нужны эти два брата для доступа к выбранным компонентам через границы модуля, передавая TYPE или CLASS безрезультатно. Я пытался ограничить USE до ONLY DT канала, но это не повлияло на результат компиляции. Мне интересно, если я что-то упустил о том, как это сделать. Как предполагается, что перекрестные ссылки Derived-Type будут выполнены в этом сценарии?

Компиляция с помощью Intel (R) Visual Fortran Compiler XE 12.0.4.196 [IA-32] ... ifort / nologo / debug: full / Od / fpscomp: filesfromcmd / warn: объявления / warn: не используется / warn: truncated_source / warn: интерфейсы / модуль: «Отладка» / объект: «Отладка» /Fd"Debug\vc90.pdb "/ traceback / check: границы / библиотеки: статические / потоки / dbglibs / c / Qvc9 / Qlocation, ссылка, "c: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin "" C: \ Users \ имя пользователя \ Documents \ Visual Studio 2008 \ Projects \ ELA \ ELA \ Modes_Mdl.f90"

Я думаю, что следующий псевдокод должен помочь прояснить эту проблему. Канал инициализируется первым, затем идут режимы. После успешной инициализации режимов канал% myArray затем должен быть заполнен через канал% calculatemyArray.

В файле Channel_mdl.f90:

MODULE Channel_MODULE
   USE GLOBAL_MODULE !omitted for clarity
   TYPE Channel_TYPE
      ! some vars
      REAL, DIMENSION(3,12) :: myArray
      LOGICAL :: populated = .false. !set to true in initChannel_Type
      CONTAINS
         PROCEDURE :: initialize => initChannel_Type !omitted for clarity
         PROCEDURE :: calculatemyArray !to be Called following successful init of Modes, thus need to share info between these objects.
   END TYPE Channel_TYPE
CONTAINS
   LOGICAL FUNCTION calculatemyArray(this, Mds) !populate myArray
      USE Modes_Module !need access to Modes%Qty array
      IMPLICIT NONE
      CLASS(Channel_Type), INTENT(INOUT) :: this
      TYPE (Mode_Type), INTENT(IN) :: Mds
      calculatemyArray = .true. !unless error occurs herein
!     initialization process ...
   END FUNCTION calculatemyArray
END MODULE Channel_Module

В файле Modes_Mdl.f90

MODULE Modes_MODULE
   USE GLOBAL_MODULE !omitted for clarity
   TYPE Modes_TYPE
      ! some vars
      INT(int16), ALLOCATABLE, DIMENSION(:) :: Qty
      LOGICAL :: populated = .false.
      CONTAINS
         PROCEDURE :: initialize => initializeModes
   END TYPE Modes_TYPE
CONTAINS
   SUBROUTINE initializeModes(this, Srcs)
      USE Channel_Module !need access to Srcs%Count to allocate Qty array
      IMPLICIT NONE
      CLASS(Modes_Type), INTENT(INOUT) :: this
      TYPE (Channel_Type), INTENT(IN) :: Srcs
!     initialization process ...
      ALLOCATE(Qty(Srcs%Count))
      populated = .true.
   END SUBROUTINE initializeModes
END MODULE Modes_Module

В файле myPgm.f90

Program foo
   USE Channel_Module
   USE Modes_Module
   IMPLICIT NONE
   TYPE (Channel_Type) :: Channels
   TYPE (Mode_Type) :: Modes
   Call Channels%initialize()
   IF (Channels%populated) THEN
      Call Modes%initialize(Channels)
!  other statements & functions
   END IF
END Program foo

Вы знаете, что одновременно грустно и хорошо? Обнаружение того, что я хотел, мешало мне получить то, что мне нужно. В вышеупомянутом сценарии, я думаю, что вся проблема исчезнет, ​​если я передам только значение подкомпонента Канала (INT), а не весь объект Канала (то, что я думал, что хотел). Тем не менее, я бы очень хотел знать, как проходить передачу объектов DT между процедурами DT. Средства для этого кажутся неуловимыми ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...