无论此附加文本的形状如何,我都想将文本添加到标量对象的组件中。
为了尝试这个,我创建了一个基本过程,它有一个基本输入参数,但只有一个intent(inout)
参数是传递的对象。
这是一个MWE:
module add_mod
implicit none
type obj_A
character(len=:), allocatable :: Message
contains
procedure, pass(objA) :: add
procedure, pass(objA) :: write
end type
contains
elemental subroutine add( objA, text )
implicit none
class(obj_A), intent(inout) :: objA
character(len=*), intent(in) :: text
objA%Message=objA%Message//text
end subroutine add
impure elemental subroutine write( objA, text )
implicit none
class(obj_A), intent(in) :: objA
character(len=*), intent(in) :: text
print*,'write ', text
end subroutine write
end module
program test
use add_mod
implicit none
type(obj_A) :: testA
call testA%add('toto')
print *, testA%Message
! call testA%add( ['toto','abcc','d,ef'] )
print *, testA%Message
call testA%write( ['toto','abcc','d,ef'] )
end program
如果我让注释行call testA%add( ['toto','abcc','d,ef'] )
,它工作正常。但是如果我取消注释,我会在编译过程中出错
错误:ELEMENTAL 子例程“add”的 INTENT(INOUT) 虚拟“objA”在 (1) 处的实际参数是标量,但另一个实际参数是数组`
我理解为什么testA%write
调用是正确的,这是由于intent(in)
传递的对象;在这种情况下,编译器知道一个参数是标量形状,另一个是数组形状。
对于testA%add( ['toto','abcc','d,ef'] )
,我也知道它需要一个形状obj_A
为的数组intent(inout)
,因为输入的文本是一个标量。因此,这不是正确的做法。
obj_A%Message
无论文本的形状如何,是否有正确的方法添加文本?