SELECT TYPE 中使用的多态假定秩实体

问题描述 投票:0回答:1

使用 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

fortran gfortran
1个回答
0
投票

嗯,我终于找到答案了。 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 中的一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.