自由格式程序的模块采用以Global_Module开头的层次结构。然后,Channel_Module和Mode_Module都使用Global,并且工作正常。所有模块都使用IMPLICIT NONE
。
我已将下面的编译器错误隔离到Modes_Module中与Modes类型相关的初始化过程中的USE Channel_Module
语句。
我确定DT旨在通过相关过程彼此共享数据,但是由于未知原因,在这种情况下它不起作用。全局和通道均使用0错误和警告进行编译。通道和模式以前都可以从其全局父级访问数据。一切都是公开的。但是,我现在需要这两个同级组件通过不传递TYPE或CLASS来跨模块边界访问选择的组件。我尝试将USE
限制为ONLY
通道的DT,但这对编译结果没有影响。我想知道我是否缺少有关如何执行此操作的信息。
在这种情况下如何实现派生类型的交叉引用?
使用Intel(R)Visual Fortran编译器XE 12.0.4.196进行编译 [IA-32] ... ifort / nologo / debug:full / Od / fpscomp:filesfromcmd / warn:声明/ warn:未使用/ warn:truncated_source / warn:interfaces / module:“ Debug \” / object:“ Debug \” /Fd"Debug\vc90.pdb“ / traceback / check:bounds / libs:static / threads / dbglibs / c / Qvc9 / Qlocation,link,“ c:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ bin“” C:\ Users \ username \ Documents \ Visual Studio 2008 \ Projects \ ELA \ ELA \ Modes_Mdl.f90“
我认为以下伪代码应有助于阐明此问题。首先初始化通道,然后是模式。在成功进行Modes初始化之后,然后打算通过Channel%calculatemyArray填充Channel%myArray。
在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
您知道同时有什么悲伤和好事吗?发现我想要的东西使我无法获得所需的东西。在上述情况下,如果仅传递Channel的Count子组件值(一个INT)而不传递整个Channel对象(我认为自己想要的),我认为整个问题都会消失。 我仍然非常想知道如何在DT过程之间传递DT对象。这样做的方法似乎难以捉摸...