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
这会工作吗?有人可以帮我这个吗?
谢谢!
答案 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 准确地说,第二个参数是括在括号中的右侧。