将派生类型与过程从模块放置到子模块

2023-12-10

我需要一些有关使用子模块的帮助。我的目的是使用一个子模块来表示来自父模块的特定派生类型,并且我想将派生类型的整个声明放入子模块中。例如,这是我想要转换的示例代码:

MODULE PARENT_MODULE

IMPLICIT NONE

TYPE , PUBLIC :: DERIVED_TYPE_A

  PRIVATE

  INTEGER :: I_00

  CONTAINS

  PROCEDURE , PUBLIC :: CALC_I_00 => CALC_DATA_I_00
  PROCEDURE , PUBLIC :: TAKE_I_00 => TAKE_DATA_I_00

END TYPE DERIVED_TYPE_A

PRIVATE :: CALC_DATA_I_00
PRIVATE :: TAKE_DATA_I_00

INTERFACE

  MODULE SUBROUTINE CALC_DATA_I_00( THIS , NUM_00 )

    CLASS( DERIVED_TYPE_A ) :: THIS
    INTEGER , INTENT( IN ) :: NUM_00

  END SUBROUTINE CALC_DATA_I_00

  MODULE FUNCTION TAKE_DATA_I_00( THIS ) RESULT( RES )

    CLASS( DERIVED_TYPE_A ) :: THIS
    INTEGER :: RES

  END FUNCTION TAKE_DATA_I_00

END INTERFACE

END MODULE PARENT_MODULE

SUBMODULE( PARENT_MODULE ) TYPE_A

CONTAINS

MODULE PROCEDURE CALC_DATA_I_00

  THIS%I_00 = NUM_00 + 2

END PROCEDURE CALC_DATA_I_00

MODULE PROCEDURE TAKE_DATA_I_00

  RES = THIS%I_00

END PROCEDURE TAKE_DATA_I_00

END SUBMODULE TYPE_A

PROGRAM TYPE_SUBMODULES

USE , NON_INTRINSIC :: PARENT_MODULE

IMPLICIT NONE

INTEGER :: I

CLASS( DERIVED_TYPE_A) , POINTER :: P_ARR_INT
TYPE( DERIVED_TYPE_A ) , DIMENSION( 3 ) , TARGET :: ARR_INT

D00: DO I = 1 , 3

        P_ARR_INT => ARR_INT( I )

        CALL P_ARR_INT%CALC_I_00( I )

        WRITE( * , * ) ARR_INT( I )%TAKE_I_00()

     END DO D00

END PROGRAM TYPE_SUBMODULES

有没有办法在子模块中使用派生类型(带有组件和过程)?例如,这样:

SUBMODULE( PARENT_MODULE ) TYPE_A

  TYPE :: D_TYPE_A

    INTEGER :: I_00

    CONTAINS

  !  PROCEDURE :: CALC_I_00 => CALC_DATA_I_00
  !  PROCEDURE :: TAKE_I_00 => TAKE_DATA_I_00

  END TYPE D_TYPE_A

  CLASS( D_TYPE_A ) , POINTER :: P_ARR_INT
  TYPE( DERIVED_TYPE_A ) , DIMENSION( 3 ) , TARGET :: ARR_INT

CONTAINS

!MODULE SUBROUTINE CALC_DATA_I_00( THIS )
!
!    CLASS( D_TYPE_A ) :: THIS
!   ! INTEGER , INTENT( IN ) :: NUM_00
!
!    THIS%I_00 = NUM_00 + 1
!
!END SUBROUTINE CALC_DATA_I_00
!
!!FUNCTION TAKE_DATA_I_00( THIS ) RESULT( RES_00 )
!!
!!    CLASS( D_TYPE_A ) :: THIS
!!    INTEGER :: RES_00
!!
!!    RES_00 = THIS%I_00
!!
!!END FUNCTION TAKE_DATA_I_00

END SUBMODULE TYPE_A

在这种情况下,我不能在主程序中使用指针和目标变量,我想这样做,或者是否可以在中声明指针和目标变量PARENT_MODULE.

我的 IDE 是带有 Gfortran 编译器的 Code::Blocks 17.12。编译器版本为:MinGW 6.3.0。


有没有办法在子模块中使用派生类型(带有组件和过程)?

简短回答:no。 (至少不是你所期望的那样)

子模块是添加到语言中的一项功能,用于解决一个特定问题:接口和实现的分离。主要动机是当您只需要更改模块中的实现细节时生成的编译级联。

但子模块不是模块!

子模块与模块绑定,并为该模块中声明的过程提供实现。因此,子模块可以访问其父模块中的所有声明。尽管如此,该模块对其子模块一无所知,并且不会像模块一样使用其子模块。该模块只是希望您在链接时添加子模块,足以覆盖所有缺少的过程实现。

因此,如果您要在子模块中声明类型或其他任何内容,那么它对于父模块来说将是本地的且不透明的。

如果您需要通过另一个单元中的主机访问程序单元的声明,则需要模块。

您必须明智地设计您的解决方案。按主题和依赖项分隔模块。如果三种类型相互引用,那么它们非常相关,应该位于同一程序单元中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将派生类型与过程从模块放置到子模块 的相关文章

  • fortran 77 到 fortran 90 的转换器软件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 fortran 77 编码 但我想转换为 fortran 90 在哪里可以下载转换器软件 这是我帮
  • 忽略 doxygen 注释块中的行

    是否可以在 doxygen 注释块中包含将被 doxygen 忽略的内容 换句话说 我们可以在 doxygen 评论块中发表评论吗 背景 我们正在将 Fortran 项目的代码内注释转换为 doxygen 可解析的格式 但是该项目要求代码内
  • Fortran 读取混合字符串和数字数据

    我在读取语句时遇到问题 我更喜欢 Fortran90 尽管如果有帮助的话其他版本也是可能的 我的文件中有一堆数据行 可以描述为 以空格分隔 没有固定的格式 包含一个字符串 后跟 7 个数字 字符串包含正斜杠 这是一个例子 maxele OS
  • 如何使用模块向 Fortran 公开 Python 回调

    这个 scipy 文档页面 http docs scipy org doc numpy dev f2py python usage html call back arguments关于 F2Py 指出 回调函数 也可以在模块中显式设置 然后
  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 可变格式

    我编写了一个程序来计算平方有限差分矩阵 您可以在其中输入行数 等于列数 gt 这存储在变量矩阵中 该程序运行良好 program fin diff matrix implicit none integer dimension allocat
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • Fortran的性能

    Fortran 的表现计算机语言基准游戏 http shootout alioth debian org 出奇的糟糕 今天的结果显示 Fortran 在两项四核测试中分别排名第 14 和第 11 在单核测试中排名第 7 和第 10 现在 我
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 带有过程参数的通用类型绑定过程

    我正在尝试编写一个通用的类型绑定过程 它将不同的回调函数作为参数 当编译以下代码 使用 ifort 12 1 3 时 我收到以下警告 module test type a type contains procedure t s gt at
  • Fortran90 中 BLAS 函数返回零

    我正在学习在Fortran90中使用BLAS 并使用子例程编写了一个简单的程序SAXPY https software intel com en us mkl developer reference fortran axpy和函数SNRM2
  • 在 VSCode Fortran 调试中检查从另一个模块导入的变量

    我正在调试一些包含许多 Fortran 模块的代码 其中一些模块彼此共享变量 不幸的是 带有 VScode 的 gdb 在调试时似乎无法检查导入的变量 目前 当我需要检查导入的变量时 唯一的方法是停止调试 并手动更改代码以包含等于导入变量的
  • 带有数字/标签的 Fortran IF 语句而不是另一个语句

    这段 Fortran 代码的含义是什么 IF J1 3 20 20 21 21 J1 J1 3 20 IF J2 3 22 22 23 23 J2 J2 3 22 CONTINUE 我在旧项目中看到过 我不知道这个带有数字 标签 的 IF

随机推荐

  • 当内容高度可变时,列表框滚动条滑块会更改大小

    我有一个显示许多对象的列表框 每个对象的高度都可以是可变的 具体取决于每个对象具有的值的数量 请参阅我之前在这里回答的问题 许多对象是 5 行高 而其他对象是 1 行 ListBox 中的滚动条看起来并不像这样 可能是由于虚拟化的原因 当你
  • PropertiesConfiguration - 在属性值中使用“/”

    我正在使用 PropertiesConfiguration 来加载和存储属性值 如果我在属性值中使用字符 它将保存为 你能帮我只保存 而不是 吗 我在这里错过了什么吗 PropertiesConfiguration databaseProp
  • 如何在 expression() 中使用 atop 函数?

    我需要添加换行符 但我正在努力使用 atop 函数expression The main是我想分成两行的部分 gt plot DAC Chlo data brazilw pch 15 col red cex 0 5 main express
  • 如何在Xamarin.Forms中调整水平ListView的大小?

    I see 这个条目尝试一下 是的 滚动方向变成水平的 但是 视图的大小不会根据视图的轮廓进行调整 结果是这样的 即使视图旋转 如何调整视图的大小 您可以使用相对布局来调整位置 这是我使用旋转垂直列表视图实现的水平列表视图的 XAML 示例
  • R 中每日两次频率的时间序列

    我有一些来自传感器的数据 每 12 小时进行一次观测 我想将其作为时间序列进行分析 但我不确定使用什么频率将其转换为时间序列 这ts函数需要开始 结束和频率 ts data start 1 end numeric frequency 1 我
  • 如何让Label的文字自动滚动?

    我有一个按钮 我想要在其中添加一些文本 但某些文本可能太长 无法很好地放入按钮中 我想让文本在一行中水平滚动 就像 HTML 中的选取框一样 我可以让它滚动一行 但是 测试文本在按钮边缘被切断 并且那里的文本实际上会移出按钮 而不是在按钮边
  • 在iis托管的wcf服务中传递文化价值

    这是我的代码 private IHelloWorld ChannelFactoryWebService ServiceEndpoint tcpEndPoint new ServiceEndpoint ContractDescription
  • 使用 ffmpeg 和 phantomjs 从 url 制作电影

    我使用 phantomjs 使用 setIntreval 函数 现在为 25 从 url 获取屏幕截图 然后通过管道将输出传输到 ffmpeg 使用帧速率 r 24 这是代码 ffmpeg js var page require webpa
  • UNIX grep 命令(grep -v grep)

    我正在经历一些事情 发现了我无法理解的事情 grep v grep 这意味着什么 我知道 v开关将选择所有不匹配的行 但为什么第二个grep 这是完整的命令 ps ef grep rsync avz grep oradata DAY 0 1
  • Laravel 4 - 无法捕获种子或迁移类中的数据库异常

    Laravel 4 与 MySql 数据库 由于某种原因 我无法捕获数据库异常 照亮 数据库 QueryException 在种子或迁移类中 代码永远不会进入 catch 块 例如 如果我尝试在 名称 列是唯一的表上插入 try data
  • 如何检测耳机是否已连接到 iPod touch G1?

    有很多文章介绍如何通过以下方式检测麦克风是否连接到 iPod touch G2 音频会话获取属性 kAudioSessionProperty AudioInputAvailable 但我还没有看到任何与检测连接到 iPod touch G1
  • VS2010拒绝编译命名空间,说它不存在

    我将我的项目从Win XP转移到另一台计算机上 从Win XP转移到Win 7 安装后 我意识到我的App code文件夹中的某个东西 名为mydata web utils命名空间 有一个名为WebConstants的类 它是公共类和公共函
  • Spark 视图最初可以工作,但在 30 分钟左右后出现“动态视图编译失败”错误

    昨天将我的 asp net mvc 带有 Spark 视图引擎 项目推送到我们的实时服务器后 我开始收到一个奇怪的错误 最初一切正常 但一段时间 可能 30 分钟 后 视图开始抛出 动态视图编译失败 错误并抱怨命名空间不存在 列出的命名空间
  • 如何使用resolve和$routeChangeError处理嵌套服务和promise

    这更像是我在使用 AngularJS 时所做的一项研究 我想分享一下 因为我认为有些人可能会发现这很有用 有时 在实例化控制器并渲染视图之前 您需要从多个服务中获取一些数据 您还可能会遇到特定服务正在等待另一个服务的响应的情况 有点嵌套的服
  • 如何制作 YouTube 无 Chrome 播放器?

    这听起来可能很愚蠢 但我在网上查了一段时间 但找不到如何使 YouTube 播放器成为无 Chrome 浏览器 我正在制作一个网络应用程序 并且正在使用 YouTube JavaScript API 无论我在网上查找有关如何实际使播放器成为
  • 序列化字典时保留大小写

    我有一个 Web Api 项目 配置如下 config Formatters JsonFormatter SerializerSettings ContractResolver new CamelCasePropertyNamesContr
  • MDbg - 调试器的协议与被调试者不兼容

    我正在使用 MDbg 检索进程的应用程序域中列出的所有程序集的列表 每当我尝试将进程附加到 MDbgEngine 时 我都会收到以下异常消息 调试器的协议与被调试者不兼容 HRESULT 异常 0x8013134B 我是否遗漏了某些内容或错
  • 如何将 pdf 文件转换为 CSV 文件?

    我想将 PDF 文件转换为 CSV 文件 我为此使用 iText 库 该程序运行良好 但输出不是所需的格式 所有数据都位于 csv 文件的第一行 输出应该与 pdf 文件完全相同 意味着带有换行符 请帮忙 提前致谢 Document doc
  • 通过图形 API 获取所有用户及其上次登录信息

    我正在尝试导出所有用户数据 包括上次登录日期 我正在关注这篇文章 https morgantechspace com 2021 09 find last login date for all azure ad users using pow
  • 将派生类型与过程从模块放置到子模块

    我需要一些有关使用子模块的帮助 我的目的是使用一个子模块来表示来自父模块的特定派生类型 并且我想将派生类型的整个声明放入子模块中 例如 这是我想要转换的示例代码 MODULE PARENT MODULE IMPLICIT NONE TYPE