使用SELECT TYPE处理多态假定秩实体的Fortran标准合规性问询
SELECT TYPE中使用假定秩实体是否符合Fortran 2018/2023标准
结论
你的代码完全符合Fortran 2018及2023标准,gfortran的报错是编译器对标准特性支持不完整导致的,并非代码违反规范。
标准条款依据
Fortran 2018(ISO/IEC 1539-1:2018)明确允许假定秩实体作为SELECT TYPE的选择器:
- 7.5.3.2节(选择器)规定,假定秩变量可以作为
SELECT TYPE的选择对象; - 7.5.3.3节(类型守卫)允许在分支中匹配该类型的任意秩实体,也可指定具体类型和秩。
Fortran 2023对这一规则没有修改,因此代码同样符合2023标准。
编译器现状说明
gfortran对Fortran 2018假定秩特性的支持仍在推进中,目前版本尚未实现SELECT TYPE中直接使用假定秩变量的逻辑,所以会抛出错误提示“Assumed-rank variable a at (1) may only be used as actual argument”。这是编译器的实现缺陷,而非代码问题。
临时 workaround(可选)
如果要在当前gfortran版本下运行代码,可以把假定秩变量传递给内部子例程,在子例程里做SELECT TYPE判断,绕开编译器限制:
MODULE m IMPLICIT NONE TYPE :: t1 INTEGER :: x END TYPE t1 TYPE :: t2 REAL :: y END TYPE t2 CONTAINS SUBROUTINE handle_data(a) CLASS(*), INTENT(IN) :: a(..) CALL inner_handle(a) CONTAINS SUBROUTINE inner_handle(local_a) CLASS(*), INTENT(IN) :: local_a(..) SELECT TYPE(local_a) TYPE IS(t1) PRINT *, "类型t1,秩:", RANK(local_a) TYPE IS(t2) PRINT *, "类型t2,秩:", RANK(local_a) END SELECT END SUBROUTINE inner_handle END SUBROUTINE handle_data END MODULE m
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

