Fortran 派生类型实例的用户定义构造函数

2023-11-23

这是我与Fortran相关的第二个问题(我使用C++,所以请原谅我的思维方式)。

我想在适当的时候使用 OOP,也就是说,在 Fortran 中使用派生类型。 在 C++ 中,您可以使用用户定义的构造函数,例如https://msdn.microsoft.com/en-us/library/s16xw1a8.aspx

在 Fortran 中,情况有所不同。 我尝试的第一件事是从这里:https://www.ibm.com/developerworks/community/blogs/b10932b4-0edd-4e61-89f2-6e478ccba9aa/entry/object_oriented_fortran_user_define_constructors2?lang=en

链接已损坏,所以我将其粘贴到此处:

module m
  !...
  interface base
    module procedure new_base
  end interface

contains
  !...
  function new_base(I)
    integer, intent(in) :: I
    type(base) new_base

    allocate(new_base%data(I))
    new_base%data = I
  end function
  !...
end module

上面的接口为基类型定义了一个用户定义的构造函数。它的使用方式与结构构造函数类似。它甚至可以采用参数关键字。

然后我找到了一些其他方法来做到这一点。 这里我列出了一些似乎可行的方法,但我只测试了第一个和第二个:

  1. 与它们应该构造的派生类型同名的通用接口,请参阅上面的链接;

  2. 使用类型绑定过程(这甚至不是“传统”构造函数)

    MODULE mymod
      TYPE mytype
        Private
        INTEGER :: x
        CONTAINS
        PROCEDURE, PASS :: init
      END TYPE
    CONTAINS
      SUBROUTINE init(this, i)
        CLASS(mytype), INTENT(OUT) :: this
        INTEGER, INTENT(IN) :: i
        write(*,*) this%x
        IF(i > 0) THEN
          this%x = 1
        ELSE
          this%x = 2
        END IF
        write(*,*) this%x
      END SUBROUTINE init
    END
    PROGRAM test
      USE mymod
      TYPE(mytype) :: y
      CALL y%init(1)
    END PROGRAM
    
  3. 使用静态构造函数或结构构造函数(http://www.lahey.com/docs/lfenthelp/NLMOvUsInvConst.htm) 但这似乎不适用于一般的 Fortranhttp://www.lahey.com/docs/lfenthelp/NLMGSWhatIs.htm

因此,我还没有充分理解在实践中初始化/构造派生类型的最优选和最灵活的方法是什么,特别是当我在开发中使用嵌套派生类型时。我希望我能在一些帮助下组织这个主题。


好的,所以我假设您仔细阅读了答案如何在 Fortran 中重写结构构造函数我会回答您在评论中提出的问题。评论中没有足够的地方来回答这个问题。

您还可以在 Fortran 中创建接受可变数量参数的构造函数。

甚至可以使用每个派生类型默认具有的默认结构构造函数。如果默认初始化一个组件,则它在构造函数中是可选的。这同样适用于可分配组件和指针组件。

For type

type t1
  integer :: i = 1
  integer, pointer :: ip => null()
  integer, allocatable :: ap
end type

你可以像这样调用默认构造函数

instance = t1()

而且这是完全合法的,i将是 1,ip将指向null and ap不会被分配。

或者你可以将其称为

 instance = t1(ap=5)

and the ap组件将被分配并设置为 5,其他组件将保留默认值。


您只需通过传递参数就可以使用用户定义的构造函数实现类似的功能optional.

function t1_user(ap, i) result(res)
  type(t1) :: res
  integer, allocatable :: ap !this argument MUST be passed,
                             ! it does not have to be allocated
  integer, optional    :: i ! this argument is optional

  if (present(i)) then
    ...
  end if
end function

任何类型绑定过程当然也可以有可选参数。


至于嵌套类型,最好将构造函数作为函数来完成,无论它们是默认的还是用户定义的:

type inner
  real :: x, y
end type

type outer
  type(inner), allocatable :: in
  real :: z
end type

instance1 = outer(inner(1., 2.), 3.)

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

Fortran 派生类型实例的用户定义构造函数 的相关文章

随机推荐

  • 过早优化的实用规则[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 看来这句话 过早的优化 是
  • RMarkdown PDF“LaTeX3 错误:错误变量”

    我已经通过 RMarkdown 创建 PDF 报告几个月了 但是今天在新机器上安装 MikTex R 以及 rmarkdown 和 tidyverse 软件包后 我在尝试编织 PDF 时收到以下错误消息 C PROGRA 2 Pandoc
  • YouTube API v3 每次都不断请求授权

    我正在使用 YouTube api v3 来检索视频列表 示例如下 https developers google com youtube v3 code samples php retrieve my uploads 我打开页面 应用程序
  • NodeJS 原生鼠标和键盘绑定 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我一直在寻找一个支持鼠标和键盘监听和执行的原生nodejs模块 我找到了这个 https npmjs org package mouse但源代码看起
  • 在 Windows Server 2012 上注册 ASP.NET 4.5 的替代方法

    当我运行 WCF 服务时 出现 MIME 未注册错误 我用过这个link来解决这个问题 之后 我开始收到另一个错误 要求我向 IIS 注册 ASP NET 框架 所以我用了 aspnet regiis 命令 但它显示以下错误 Microso
  • D3 Crossfilter 基本示例

    我刚刚接触 D3 非常喜欢交叉过滤库 我想生成类似的东西 但我没有使用航班数据 而是采用以下格式的 CSV 数据 行 列 值 我只想要一个显示值的直方图 以及一张按值字段排序的表格 很难理解他们的例子中发生了什么 有人可以建议或展示一个非常
  • YouTube 嵌入在 Firefox 中不起作用

    我嵌入了三个 Youtube 视频 它们在除 Firefox 之外的所有浏览器中都能完美运行 尝试在服务器端清除缓存 在本地清除cookies和缓存 尝试了18台不同的计算机 尝试了Windows 7 Windows 8 Linux Ubu
  • 观察 NSMutableArray 的插入/删除

    一个类有一个类型为 NSMutableArray 的属性 和实例变量 带有合成访问器 通过 property 如果您使用以下命令观察该数组 myObj addObserver self forKeyPath theArray options
  • INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别? [复制]

    这个问题在这里已经有答案了 有什么区别INNER JOIN LEFT JOIN RIGHT JOIN and FULL JOIN in MySQL SQL JOIN 子句用于组合两个或多个表中的行 基于他们之间的共同领域 SQL 中有不同类
  • 在Perl中,如何获得多个集合的笛卡尔积?

    我想用 Perl 进行排列 例如我有三个数组 big tiny small 然后我有 red yellow green 并且 apple pear banana 如何得到 big red apple big red pear etc sma
  • LZ4库解压数据上限大小估计

    我在用着LZ4库以及解压缩数据时 int LZ4 decompress safe const char source char dest int compressedSize int maxDecompressedSize 我想估计最大解压
  • 混杂模式下的数据包套接字仅接收本地流量

    我有一个创建的套接字socket PF PACKET SOCK RAW htons ETH P ALL 我使用以下方法将其设置为混杂模式 struct ifreq ifr strncpy char ifr ifr name interfac
  • 获取 will_paginate 在第一页上定义自定义偏移量

    我正在我的网站上建立一个新闻版块铁路网站它使用将分页用于分页 现在我想知道如何指定自定义偏移量对于带有 will paginate 的第一页 像这样的东西 featured news Post first news Post offset
  • 如何计算矩阵中给定值的元素数量?

    有谁知道如何计算一个值在矩阵中出现的次数 例如 如果我有一个 1500 x 1 矩阵M 向量 存储工作日 1 7 的值 我如何计算存储了多少个星期日 1 星期一 2 星期六 7 M 看一下确定并计算数组的唯一值 或者 计算出现的次数5 简单
  • HttpContext.Current.Response 和 Page.Response 有什么区别?

    我正在解决一组安全页面上的缓存问题 并意识到需要修改所有响应的标头 当我整理解决方案时 我想知道 HttpContext Current Response 和 Page Response 之间的区别以及何时应在应用程序中使用每个对象 Tha
  • 如何防止在sqlite数据库中插入重复值(如果重复则覆盖)

    我在数据库中创建了两个表 在两个表中我同时插入值 现在我想做的是 我想在第二个表中插入记录 但条件是 如果有两个相同的记录记录然后我只想插入一条记录而不是重复值 在第二个表中有两个字段 一个是id第二个是category 当用户插入两个相同
  • 如何在Windows命令脚本中使用sql*plus来控制流程?

    我正在尝试使用 sql plus 来控制一个小的 Windows 命令脚本 基本上 我想执行一些 PL SQL 可能从视图或表中选择或执行函数 它显示数据库中某些行的状态 然后根据行的状态执行一些 Windows 命令 我的问题是如何将结果
  • 使用“class”关键字声明变量与在函数签名中声明不使用“class”关键字的变量

    这两种方法有什么区别 有时 当我遇到编译时错误时 抱怨编译器无法识别 函数签名中存在一些类类型 那么如果我在各个变量前面添加关键字 class 总是可以解决此类编译时错误 例如 如果编译器无法识别类型Client in void recv
  • 如何从突变中获取新对象的ID?

    我有一个createObject突变返回新对象的 ID 返回后 我想重定向到有关新对象的详细信息页面 如何使用反应 中继从包含组件中的突变获取响应字段 E g my createObject页面包含如下代码的突变 var onFailure
  • Fortran 派生类型实例的用户定义构造函数

    这是我与Fortran相关的第二个问题 我使用C 所以请原谅我的思维方式 我想在适当的时候使用 OOP 也就是说 在 Fortran 中使用派生类型 在 C 中 您可以使用用户定义的构造函数 例如https msdn microsoft c