Модули программы свободной формы используют иерархию, начинающуюся с 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. Средства для этого кажутся неуловимыми ...