Fortran语法分配

时间:2018-06-13 14:32:13

标签: syntax fortran variable-assignment

Fortran语法让我发疯!任何人都可以解释我如何调用作业(我非常确定这不是正确的术语......)。我尝试根据值类型分配类型。我有以下内容:

module test_module

   implicit none

   type :: mytype

      integer   :: i
      real      :: r
      logical   :: l

   contains

      generic :: assignment(=) => mytype_to_type
      procedure, pass(me) :: mytype_to_type

   end type mytype

contains

   subroutine mytype_to_type(t, me)

      implicit none

      class(*), intent(inout)   :: t
      class(mytype), intent(in) :: me

      !.. process based on input type
      select type (t)
         type is (integer)
            t = me%i
         type is (real)
            t = me%r
         type is (logical)
            t = me%l
         class default
            stop "none"
            return
      end select

   end subroutine mytype_to_type

end module test_module

program test

    use test_module

    implicit none

    type(mytype) :: t_type

    integer :: i = 1
    real    :: r = 1.
    logical :: l = .true.

    t_type = i                 !! how is this supposed to work?

    select type(t_type)

        type is (integer)
            write(*,*) "is int"
        type is (real)
            write(*,*) "is real"
        type is (logical)
            write(*,*) "is logical"
        class default
            return

    end select


end program test

这会工作吗?有人可以帮我这个吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

在支持定义赋值的子程序中,两个参数是这样的,即第一个对应于赋值语句的左侧,第二个对应于右侧。 1

这里,您提供的子例程是从my_type表达式到无限多态对象的赋值。这不是你想要的,看左边是t_type

相反,您应该为<{1}}对象提供已定义的分配

my_type

也就是说,您可以使用针对您支持的每种类型的特定子例程执行此操作,而不是使用通用分辨率的无限多态右侧。在这种情况下,您还可以考虑通用结构构造函数(subroutine stuff_to_mytype(me,t) class(mytype), intent(out) :: me class(*), intent(in) :: t !.. process based on input type select type (t) type is (integer) me%i = t type is (real) me%r = t type is (logical) me%l = t class default stop "none" return end select end subroutine stuff_to_mytype )。

1 准确地说,第二个参数是括在括号中的右侧。