现代 Fortran:从后代调用祖先过程

2023-12-08

我开始使用 Modern Fortran 的 OO 功能,并且已经熟悉其他语言的 OO 功能。在 Delphi (Object Pascal) 中,通常在其重写的后代过程中调用过程的祖先版本,甚至有一个语言语句“继承”允许这样做。我找不到等效的 Fortran 构造 - 但我可能正在寻找错误的东西。请参阅下面的简单示例。非常感谢任何建议。

type tClass
  integer :: i
contains
  procedure Clear => Clear_Class
end type tClass

type tSubClass
  integer :: j
contains
  procedure Clear => Clear_SubClass
end type tSubClass

subroutine Clear_Class
  i = 0
end subroutine

subroutine Clear_SubClass
  inherited Clear ! this is the Delphi way
  j = 0
end subroutine

下面是一些示例代码,尝试通过 @HighPerformanceMark 实现注释(即,子类型具有引用父类型的隐藏组件)。

module testmod
    implicit none

    type tClass
        integer :: i = 123
    contains
        procedure :: Clear => Clear_Class
    endtype

    type, extends(tClass) :: tSubClass
        integer :: j = 456
    contains
        procedure :: Clear => Clear_SubClass
    endtype

contains

    subroutine Clear_Class( this )
        class(tClass) :: this
        this % i = 0
    end

    subroutine Clear_SubClass( this )
        class(tSubClass) :: this
        this % j = 0
        call this % tClass % Clear()  !! (*) calling a method of the parent type
    end
end

program main
    use testmod
    implicit none
    type(tClass) :: foo
    type(tSubClass) :: subfoo

    print *, "foo (before) = ", foo
    call foo % Clear()
    print *, "foo (after)  = ", foo

    print *, "subfoo (before) = ", subfoo
    call subfoo % Clear()
    print *, "subfoo (after)  = ", subfoo
end

给出(使用 gfortran-8.2)

 foo (before) =          123
 foo (after)  =            0
 subfoo (before) =          123         456
 subfoo (after)  =            0           0

如果我们注释掉标有(*)的行,subfoo % i保持不变:

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

现代 Fortran:从后代调用祖先过程 的相关文章

  • SELECT TYPE 构造中的多态性分配

    我试图定义一个分配不同类型数组的子例程 这是代码的简化版本 subroutine Allocation1 Vec class allocatable intent out Vec select type Vec type is real 8
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • 如何使用模块向 Fortran 公开 Python 回调

    这个 scipy 文档页面 http docs scipy org doc numpy dev f2py python usage html call back arguments关于 F2Py 指出 回调函数 也可以在模块中显式设置 然后
  • 使用命令行查找数据文件的行数

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

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • 如何在 makefile 中拥有正确的 .mod 顺序

    我正在尝试用 Fortran 为我的项目创建一个 Makefile 并使其可在现在的项目中重用 我经过多次尝试后得出的 Mkefile 如下 问题是它在少数情况下工作正常 但现在我有这个文件 main f90 初始 f90 参数 f90 函
  • MPI_Gather 在最基本的代码中给出了 seg 错误

    我正在开发一个更大的程序 但我在 MPI Gather 上遇到了困难 我编写了一个最小的示例代码 请参见下文 program test use MPI integer ierr rank size double precision allo
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • FORTRAN:数据多态

    我试图隐藏真实数据类型和复杂数据类型之间的差异 在 FORTRAN 2003 中 我认为可能有一种方法可以做到这一点 目标是定义一个多态可分配数组 其类型可以在运行时决定 另外 还有一个子例程 它使用多态数组来做一些代数 相同的方程适用于真
  • 使用 Cygwin64 的 Fortran MPI

    我正在使用 Codeblock IDE 编写和编译我的 Fortran 程序 现在我想将 MPI 包含到我的 GNU Fortran 编译器中 在遵循 GNU GCC 编译器的一些指南之后 我突然想到我需要为 MPICH2 设置以下内容 有
  • 派生类型数组:选择条目

    目前在我的代码中我有一个二维数组 integer allocatable elements 并定义一些常量 integer parameter TYP 1 integer parameter WIDTH 2 integer paramete
  • 使用 Fortran 90 正确读取输入文件中的注释行

    据我了解 Fortran 在从文件读取数据时 会跳过以星号 开头的行 假设它们是注释 好吧 我似乎在用我创建的一个非常简单的程序实现这种行为时遇到了问题 这是我的简单 Fortran 程序 1 program test 2 3 intege

随机推荐

  • 从向量对中获取值时出错

    为什么在访问对向量的迭代器中对的值时会出现以下错误 vector lt pair
  • 使用 php 从非公共 html 文件夹下载文件

    我有许多文件存储在服务器上 但不在 public html 目录中 这个想法是 登录的用户可以下载文件 使用 SESSION 变量来检查他们是否登录 但如果其他人使用他们的计算机 他们就无法在浏览器历史记录中看到直接文件路径 即使他们这样做
  • Gluon Mobile 项目不适用于 gradle 6

    我有一个 Gluon 移动项目 其 build gradle 如下所示 buildscript repositories jcenter google mavenCentral maven url http nexus gluonhq co
  • 如何从 R 中的流式 MapReduce 作业获取文件名?

    我正在流式处理 R mapreduce 作业 并且需要获取文件名 我知道 Hadoop 在当前作业启动之前设置环境变量 并且我可以使用 Sys getenv 访问 R 中的环境变量 我发现 获取流式hadoop程序中的输入文件名 和 Sys
  • 正交船体算法

    我正在尝试找到一种方法来确定直线多边形来自一组整数点 由下图中的红点表示 下图显示了我想要实现的目标 1 我只需要定义直线多边形边界的最小点集 我能找到的大多数船体算法都不满足这个问题的正交性质 例如礼物包装算法 产生以下结果 即not我想
  • 哈斯克尔:记忆化

    在离开多年并忘记一切之后 我正在尝试重新学习 Haskell 但我发现自己仍然感到困惑记忆化 特别是 我正在尝试编写一个程序来生成混乱的数量D n of n对象 原始位置没有任何项目的排列 号码D n 可以递归地定义为D 1 0 D 2 1
  • OpenCV 3.0 线迭代器

    我想使用线迭代器在使用 Python 的 OpenCV 3 0 中 为 Python 构建的 OpenCV 3 0 仍然可用吗 看来网上的答案都指向cv InitLineIterator这是cv模块 我尝试导入此模块 但似乎它不包含在当前版
  • 使用 Kubernetes 部署并通过 Ingress 连接后 SSE 损坏

    我有一个使用 EventStream 的 ReactJS 客户端和一个实现 SSE 的 golang 后端 当我将浏览器连接到在 localhost 上运行的后端时 以及当我的后端在带有端口转发的 k8s 上运行时 一切似乎都正常 一旦我使
  • 在 Java 中使用 XSOM 解析 XSD 架构。如何访问元素和复杂类型

    我在使用 Java 中的 XSOM 解析 XSD 文件时遇到了很多困难 我有两个 XSD 文件 一个定义日历 第二个定义全局类型 我希望能够读取日历文件并确定 日历有 3 个属性 有效的是一个名为 eYN 的 ENUM Cal 是一个字符串
  • 从 Java/ Android 线程返回值

    我的 android 类中有以下线程 如何从线程中获取 err 的值 public int method new Thread new Runnable int err Override public void run err device
  • 使用 @XmlPath 和 jaxb/MOXy 来映射复杂类型

    我有一个深层 XML 结构 其中有许多无意义的包装器 我将其映射到单个 Java 类 使用 XmlPath 映射简单的数据类型就像在公园散步 但是当涉及到实际需要自己的类的类型时 我不太确定如何做到这一点 特别是当这些类型也应该放入列表中时
  • PHP 的字母等效项 is_numeric

    我正在寻找一个与 is numeric 按字母顺序等效的函数 如果字符串中只有字母 则返回 true 否则返回 false PHP 中是否存在内置函数 你要ctype alpha
  • 我的代码中的未知修饰符[重复]

    这个问题在这里已经有答案了 输出错误 未知修饰符 p 你的字符串包含一团糟 这需要转义为 使用时 作为正则表达式分隔符 代替 作为正则表达式分隔符 使用不会出现在字符串中的内容 例如 例如 你must选择有保证的定界字符not出现在 Src
  • jQuery 停止 fadeTo 效果

    我想要的是一种鼠标轨迹效果 当你将鼠标悬停在 div 上或向下时 但是 如果您将鼠标悬停过快几次然后停止 效果就会自行重复 我该如何解决这个问题 我想我需要某种出队的东西 比如动画选项 但对于 fadeTo 功能 有任何想法吗 test m
  • 根据条件连接data.table中的列名[重复]

    这个问题在这里已经有答案了 这就是我的 data table 的样子 最右边的一列PASTE是我想要的专栏 library data table dt lt fread A B C PASTE TRUE FALSE TRUE A C TRU
  • DigitalMicrograph 脚本对象是否可以收到图像 ROI 变化的通知?

    DigitalMicrograph 脚本文档提到了各种类型的 Listener 对象 这些对象可用于向脚本对象通知各种类型的事件 特别是 ImageDisplay 对象对按键侦听器具有显式支持 以便当击键事件针对特定图像显示时可以通知脚本对
  • LC-3 组装两个数字相减

    我对这个问题有疑问 因为我是 LC 3 编程的新手 编写 LC 3 代码 将 R0 中的值减去 R1 中的值 并将结果放入 R5 中 即编写 R5 R0 R1 的汇编代码 假设R1 10 R0为12 根据你的问题 我们可以假设 12 和 1
  • 301重定向以仅删除主页上的查询字符串

    我不知道 htaccess重定向规则 如果用户输入http example com abc 123 or https example com who 123 or https example com xyz 123那么它应该重定向到http
  • C++ 中的前递增比后递增更快 - 正确吗?如果是,为什么呢? [复制]

    这个问题在这里已经有答案了 我听说 C 中的前增量 i 比后增量 i 快一点 真的吗 这又是什么原因呢 后增量通常涉及保留前一个值的副本并添加一些额外的代码 预增量只是完成它的工作并摆脱困境 我通常会预增量 除非语义会改变并且后增量实际上是
  • 现代 Fortran:从后代调用祖先过程

    我开始使用 Modern Fortran 的 OO 功能 并且已经熟悉其他语言的 OO 功能 在 Delphi Object Pascal 中 通常在其重写的后代过程中调用过程的祖先版本 甚至有一个语言语句 继承 允许这样做 我找不到等效的