Fortran 90 或 2003 中的访问运算符“[ ]、( )、{ }”重载

2024-01-01

我可以在 FORTRAN 2003 中重载派生数据类型的条目访问运算符 []、() 或 {} 吗?在下面的示例中,我想为派生数据类型“custom”定义访问方案。

type custom
   integer, dimension(:), allocatable :: a
end type custom

type(custom) :: t

! after some initialization 
! .....
! .....
! .....
!
t%a( (/ 1, 2, 5 /) ) ! return entries located in positions 1, 2, and 5
t{ (/ 1, 2, 5 /) }   ! ?????? I want to define what stuff it should return 

我怎样才能做到这一点?

Update:

请注意,我不想直接使用数组“t%a”并对其进行传统的子数组操作。相反,我想重新定义数据类型“custom”的数组操作,以便 t{'first'} 应该返回 t%a 或 t%a(1) 中第一个条目的指针,所以我可以说

t['first']= 18 

or

print *, t['first']. 

另外,通过额外的重载,我希望获得像 t[1] = 18 这样的功能,就像 t['first'] = 18 一样工作。


这取决于你所说的“返回”是什么意思。

本身提供的例子

t%a([1,2,5])   ! Using syntax offered by Fortran 2003

doesn't return任何东西:这是一个子对象。通过引用该子对象,我们可以做各种事情:

print *, t%a([1,2,5])
t%a([1,2,5]) = 27
t%a([1,2,5]) = sin(real(t%a([1,2,5])))

但仍然没有“回归”的概念。至关重要的是,正如我们将看到的,这些不是表达。

Coming to the question, can t[], t(), t{} mean something, then the answer is, simply, "no".* You may want, for example, to say:

t[1,2,5] = 1

to mean

t%a[1,2,5] = 1

但这不是需要考虑的事情。

可以创建一个像这样的表达式

print *, t%ref([1,2,5])

但我们完全处于无法定义的领域。

然而,正如您现在提到指针一样,还有更多要说的。虽然首选语法t[1] or t["first"]不可用时,我们仍然可以选择类型绑定过程。例如,函数调用t%ref("first")很可能能够返回指向第一个元素的指针t%a。例如,t%ref(1)可能就像

module reference

  implicit none

  type custom
     integer, dimension(:), allocatable :: a
   contains
     procedure ref
  end type custom

contains

  function ref(t, idx)
    class(custom), target, intent(in) :: t
    integer, intent(in) :: idx
    integer, pointer :: ref

    ref => t%a(idx)
  end function ref

end module reference

  use reference
  implicit none

  type(custom), target :: t
  integer, pointer :: b

  t%a = [1, 2, 3, 4, 5]

  print *, t%a
  b => t%ref(1)  ! Fortran 2008 allows direct assignment
  b = 8          ! but compiler support is very limited.
  print *, t%a

end

如果需要的话ref可以通用,以便t%ref("first")(等)是可以接受的。


* I'm basing that on the fact that here t is a scalar. However, as mentioned by Vladimir F in a comment () and [] potentially do mean things. The first relates to arrays and the second to co-arrays. Syntax, then, is an issue, but this answer looks more at the mechanism than syntax.

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

Fortran 90 或 2003 中的访问运算符“[ ]、( )、{ }”重载 的相关文章

  • 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

    我想使用 OpenMP 在 C 程序中并行求解多个大型 ODE 系统 由于某些原因 我需要使用 ODE 求解器 但我只能找到 Fortran 90 子例程 而且代码太大 无法简单地将其转换为 C 我知道 Fortran 广泛使用静态内存 因
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • C++ 模板友元运算符重载

    我的代码有什么问题吗 template
  • 类模板上的运算符重载

    我在为模板类定义一些运算符重载时遇到一些问题 让我们以这个假设的类为例 template
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • Fortran 意图(inout)与省略意图

    良好的实践表明 Fortran 中的子例程参数每个都应具有指定的意图 即intent in intent out or intent inout 如上所述这个问题 https stackoverflow com questions 1011
  • Fortran90 中 BLAS 函数返回零

    我正在学习在Fortran90中使用BLAS 并使用子例程编写了一个简单的程序SAXPY https software intel com en us mkl developer reference fortran axpy和函数SNRM2
  • 如何正确重载流运算符以在多态类中进行打印?

    编辑 代码有一个拼写错误 现在它可以编译 但我仍然没有得到我想要的输出 我正在尝试重载流运算符std cout std fstream等等 但我无法正确处理多态性 我无法获得我想要看到的输出 我希望子类先显示超类的内容 然后显示其内容 而超
  • 分发编译后的 fortran 库和模块文件

    我有一个Fortran使用很多模块的库 我用ifortWindows 上的编译器 因此 我得到一个 lib图书馆的文件和 mod所用模块的文件 这有一个缺点 我还必须分发 mod文件 如果我想在另一个程序中使用编译的库 如何防止这种情况发生
  • 在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?

    我为 R 编写了一个二元运算符函数 即名称类似于 X 这样就不必输入 X a b 我可以使用更方便的语法a X b 我的目标是有一个包装器 lt 它会执行一些操作 例如记录对该环境中的对象所做的操作并检查 受保护 属性 该属性会在覆盖该对象
  • 派生类型数组:选择条目

    目前在我的代码中我有一个二维数组 integer allocatable elements 并定义一些常量 integer parameter TYP 1 integer parameter WIDTH 2 integer paramete
  • Fortran 指针数组

    同样 Fortran 中的指针数组 好吧 我有一个派生类型 type t context pointer type t context pointer p ctx end type t context pointer 当我在主程序中执行以下
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 当输入字符而不是数字时,防止 FORTRAN 关闭

    我有一个读取语句需要一个数字 非常简单的示例代码 program test integer var read var end 问题是我通常输入一串字符 即 yes 因为分心 如何防止我的代码完全停止并显示以下类型的错误消息您输入了错误的值
  • 非成员运算符重载应该放在哪里?

    我想要超载operator lt lt 为了我的班级 我应该将这个重载定义添加到std命名空间 自从ostream operator lt lt 是的一部分std命名空间 或者我应该将其保留在全局命名空间中 简而言之 class MyCla
  • 删除字符串中的空格

    我有以下代码 program main character len 15 abc te st tex t print trim abc end program main 哪个输出 te st tex t 我排除了所有要删除的空白 但事实并非
  • openmpi 忽略错误:无法识别 mca 接口

    今天早上 我升级了 gfortran 从 4 7 到 6 1 0 和 OpenMPI 从 1 10 到 2 0 1 编译器 我写了这个简单的程序 program main use mpi f08 implicit none

随机推荐