fortran - 将用户类型转换为数组的通用接口(interface)

标签 fortran

我有一个简单的用户定义类型

use, intrinsic :: iso_fortran_env
implicit none

type :: vector
    real(real64) :: data(3)
end type

定义了各种接口(interface)以及数组的赋值运算符。

我需要的是一个抽象接口(interface)

interface assignment(=)
   procedure v_to_a_assign, a_to_v_assign
end interface    

这意味着我可以做类似的事情

type(vector) :: v
real(real64) :: a(3)
a = v

但是我想做的是一个数组构造函数,例如

type(vector) :: v
real(real64) :: q(4)
q = [1d0, v]
! error #8209: The assignment operation or the binary expression operation is 
!              invalid for the data types of the two operands.   [v]

如果v是一个real(real64)数组,我就可以做到这一点。 我的问题是我需要定义什么二元运算才能使上述工作正常进行?

上面只是将用户类型隐式转换为数组的一个示例。我想定义正确的运算符,以便我的用户类型在需要时自动转换为数组,例如在函数参数和/或其他构造中。


解决方案

使用关键字real定义转换接口(interface)。

interface real
    procedure v_to_array
end interface

contains
    function v_to_array(v) result(a)
    type(vector), intent(in) :: v
    real(real64), dimension(3) :: a
        a = v%data
    end function

并将其用作

q = [1d0, real(v)]

<子>引用文献Array Constructors

最佳答案

该语言不支持您所追求的隐式转换。

引用数组组件,可以直接使用数组构造函数中的组件:

q = [1.0_real64, v%data]

或编写适当的访问器函数/一元运算符。

q = [1.0_real64, .getdata. v]

考虑到语言定义通用解析的方式,您寻求的隐式转换将会出现问题。

就风格而言,显式转换通常是首选 - 例如,在分配给 vector 类型的对象时,使用结构构造函数作为表达式,而不是用户定义的分配,使用访问器函数或分配给实数数组时的一元运算符。需要澄清的是,用户定义的赋值不会调用赋值左侧变量的自动(重新)分配。

(Fortran 没有赋值运算符 - 它有一个赋值语句。)

关于fortran - 将用户类型转换为数组的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66217855/

相关文章:

java - 使用Java解析FORTRAN输出文件

python - 将 ifort 与 f2py 结合使用时禁用 fp-model strict

arrays - Fortran 中没有 Allocate() 的可变大小数组

python - 将 Fortran 二进制文件读入 Python

linker - fortran 中的多重定义链接错误(ifort - gfortran)

fortran - 将 4 维数组减少为 2 Fortran

c++ - 如何处理不同的数组大小作为函数的参数?

memory-leaks - 取消分配 Fortran 派生类型是否也会自动取消分配成员数组和指针?

io - Fortran 写入输出中的奇怪字符

string - Fortran:在打印出之前判断字符串是否未定义