为何`interface write(formatted)`块被忽略?附参数类型疑问
Fortran自定义派生类型格式化输出:常见疑问解答
1. 能否用独立接口块定义write(formatted)?
不行。Fortran标准明确规定,派生类型的格式化I/O绑定(write(formatted)/read(formatted))必须作为类型绑定过程定义在类型内部的contains块中,不能通过全局独立接口块来关联。
你遇到的“编译无错但接口被忽略”的情况,是因为编译器无法将独立接口块中的过程识别为对应range类型的I/O处理逻辑——只有把write(formatted)声明为类型的泛型绑定,编译器才会在对该类型对象执行格式化输出时调用对应的过程。
2. 用type(range)替代class(range)编译报错的原因
这是标准强制要求的,不是你的理解偏差。在write(formatted)的绑定过程中,第一个哑元必须声明为class(range)(多态类型),哪怕你的range类型没有被扩展派生。Fortran的I/O绑定过程对第一个参数的要求是可扩展的多态对象,如果用非多态的type(range),会违反标准规则,导致编译报错。
正确实现示例
以下是符合标准的自定义格式化输出写法:
module range_mod implicit none type :: range real :: low, high contains ! 将write(formatted)关联到自定义处理过程 generic :: write(formatted) => write_range end type range contains subroutine write_range(this, unit, iotype, v_list, iostat, iomsg) ! 第一个参数必须是多态的class(range) class(range), intent(in) :: this integer, intent(in) :: unit character(*), intent(in) :: iotype integer, intent(in) :: v_list(:) integer, intent(out) :: iostat character(*), intent(inout) :: iomsg ! 自定义输出格式 write(unit, '(A,F6.2,A,F6.2,A)', iostat=iostat, iomsg=iomsg) & "Range: [", this%low, ", ", this%high, "]" end subroutine write_range end module range_mod program test_range use range_mod implicit none type(range) :: r r = range(1.0, 5.0) ! 会调用自定义的write_range过程 print *, r end program test_range
内容的提问来源于stack exchange,提问作者Sean1708
相关产品推荐
相关产品推荐

