Fortran 初始化派生类型内联或类型转换

fortran initializing a derived type inline or type casting

我想知道是否有办法在子例程中内联传递派生类型。假设我有一个模块

 module test_mod

 type a
 end type

 type b
 end type

 contains

 subroutine test(var)
 type(a),intent(in) :: var
 ...
 end subroutine

 subroutine test(var)
 type(b),intent(in) :: var
 ...
 end subroutine

 end module

我可以在哪里实现这个模块,比如

 program testTest
 use test_mod
 call test(type(a)::temp)
 ! call test(type(a)::temp) ! or
 end program

我知道这可以在 c++ 中使用 (double)(i) 之类的东西来完成,但这是一个转换。我对(我猜)初始化派生类型 inline

感兴趣

您使用的语法与该语言不同,但您可以使用结构构造函数

它是一个returns类型的函数,它与类型同名。每个派生类型都有一个默认类型,您可以通过覆盖通用接口中的类型名称来定义自己的派生类型。默认构造函数的参数是类型组件。

program testTest
 use test_mod
 call test(a())
end program

您还可以在其他情况下、在复合表达式中或仅在简单赋值的右侧使用构造函数

type :: t
  real :: x
end type

type(t) :: o

o = t(1.0)

用户定义的构造函数示例:

    type :: t
      real :: x
    end type

    interface t
      module procedure my_init
    end interface

  contains

    function my_init(...) result(res)
      type(t) :: res
      ...
    end function