如何解决在子例程调用中使用用户定义的派生类型赋值
我想通过编写一个更 Pythonic 的字符串类型来克服 fortran 中糟糕且不直观的字符串处理,但我遇到了派生类型(重载)赋值的平均问题。 主要类型应该看起来像
TYPE t_string
CHARACTER(:),ALLOCATABLE :: str
contains
...
END TYPE t_string
在派生类型程序中具有它的威力。当然,新的字符串类型应该尽可能与固有的 CHARACTER(len=*)
类型没有区别。特别是我想使用内部例程(使用 character
类型)而无需任何额外的类型转换。因此,我在 CLASS(t_string)
和 CHARACTER(len=*)
之间定义了一个赋值运算符。例如。 open
使用新类型的文件应如下所示:
type(t_string) :: filename
filename = '...'
open(file = filename,...)
! ^ assignment here
由于在 file=filename
和 t_string
之间存在赋值 CHARACTER(len=*)
,因此调用 open
应该没有问题。但由于类型不匹配,我收到错误消息。
我想问题是,子程序调用中的赋值并不是真正的赋值,而只是一些语法约定。
- 知道如何解决这个问题吗?
- “子程序赋值”不是真正赋值的原因是什么(就 fortran 语言的设计而言)?
- 我不想打电话给
open(file = filename%str,...)
这是一个mwe:
MODULE m_string
IMPLICIT NONE
SAVE
INTERFACE ASSIGNMENT(=)
MODULE PROCEDURE :: string_operator_equal_s,string_operator_equal_c
END INTERFACE ASSIGNMENT(=)
TYPE t_string
CHARACTER(:),ALLOCATABLE :: str
END TYPE t_string
CONTAINS
ELEMENTAL SUBROUTINE string_operator_equal_s(lhs,rhs)
IMPLICIT NONE
CLASS(t_string),INTENT(inout) :: lhs
CLASS(t_string),INTENT(in) :: rhs
lhs%str = rhs%str
END SUBROUTINE string_operator_equal_s
ELEMENTAL SUBROUTINE string_operator_equal_c(lhs,INTENT(inout) :: lhs
CHARACTER(len=*),INTENT(in) :: rhs
lhs%str = rhs
END SUBROUTINE string_operator_equal_c
SUBROUTINE routine(char)
CHARACTER(len=*) :: char
END SUBROUTINE routine
END MODULE m_string
PROGRAM test
USE m_string
TYPE(t_string) :: str
CHARACTER(len=10) :: char
CALL routine(char) ! no error
CALL routine(char=str) ! error: #6633: The type of the actual argument differs from the type of the dummy argument. [STR]
END PROGRAM test
解决方法
由于在 t_string 和 CHARACTER(len=*) 之间有一个赋值 file=filename,所以调用 open 应该没有问题。
不存在这样的分配。您仅使用说明符名称来指定要传递的语句的哪个参数(类似于 Python 中的关键字/命名参数,但不相同)。 open
实际上不是过程,而是语句,但它也有通过名称区分的“参数”(说明符)。
因此不应调用派生赋值。您必须自己转换为 character
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。