使用 Fortran 超过 30 年之后,我遇到了一个问题,即多态性和假定的秩实体似乎提供了一种简洁的算法。 在
SELECT TYPE
中使用假设等级实体会导致 gfortran 出现奇怪的错误消息。
gfortran -o z a.f90
a.f90:78:22:
78 | select type (a)
| 1
Error: Assumed-rank variable a at (1) may only be used as actual argument
以下代码是否符合标准? 我已经阅读了 F2018 和 F2023 标准的部分内容,但无法找到答案。 我想做的最短的 MWE 是
program foo
implicit none
integer i
real(4) x
i = 1
x = 42
call bar(i)
call bar(x)
contains
subroutine bar(a)
class(*), intent(in) :: a(..)
integer rnk, typ
select rank (a)
rank (0)
rnk = 0
rank (1)
rnk = 1
rank default
stop 'bad rank'
end select
select type (a)
type is (integer)
typ = 0
type is (real(4))
typ = 1
class default
print *, 'bad type'
end select
! call something(rnk, typ)
end subroutine bar
end program foo
嗯,我终于找到答案了。 gfortran 实现了 Fortran TS 29113 C535b,它出现在假定排名之前。 Fortran 2003 包含
C840 An assumed-rank variable name shall not appear in a designator
or expression except as an actual argument that corresponds to a dummy
argument that is assumed-rank, the argument of the function C_LOC or
C_SIZEOF from the intrinsic module ISO_C_BINDING (18.2), the first
dummy argument of an intrinsic inquiry function, or the selector of
a SELECT RANK statement.
gfortran 中的一个错误。