【问题标题】:Ambiguous interface in Fortran generic interfaceFortran 泛型接口中的歧义接口
【发布时间】:2014-07-12 09:22:55
【问题描述】:

我不熟悉 Fortran。这是一个带有一些子程序的通用接口。 gfortran 4.8 抱怨说:

通用接口“sorti”中的歧义接口“sortic4”和“sortic”在 (1)

        INTERFACE SORTI

            SUBROUTINE  SORTIC( N, IND, TBLC )
            INTEGER      , INTENT(IN   ) :: N
            INTEGER      , INTENT(INOUT) :: IND( N )
            CHARACTER*(*), INTENT(IN   ) :: TBLC( * )
            END SUBROUTINE  SORTIC

            SUBROUTINE  SORTIC4( N, IND, TBLC )
            INTEGER      , INTENT(IN   ) :: N
            INTEGER      , INTENT(INOUT) :: IND( N )
            CHARACTER*(*), INTENT(IN   ) :: TBLC( * )
            END SUBROUTINE  SORTIC4

            SUBROUTINE  SORTIC8( N, IND, TBLC )
            INTEGER(8)   , INTENT(IN   ) :: N
            INTEGER(8)   , INTENT(INOUT) :: IND( N )
            CHARACTER*(*), INTENT(IN   ) :: TBLC( * )
            END SUBROUTINE  SORTIC8

            SUBROUTINE  SORTI1( N, IND, TBL1 )
            INTEGER, INTENT(IN   ) :: N
            INTEGER, INTENT(INOUT) :: IND( N )
            INTEGER, INTENT(IN   ) :: TBL1( * )
            END SUBROUTINE  SORTI1
             ....
        END INTERFACE

代码来自ioapi3.1库,m3utilio.f:http://www.baronams.com/products/ioapi/index.html

怎么了?

【问题讨论】:

    标签: fortran generic-interface


    【解决方案1】:

    前两个子例程(SORTICSORTIC4)具有完全相同的伪参数类型、种类和维度(等级)。因此,TKR 决议无法区分它们,它们是模棱两可的。它们必须在某些属性上有所不同才能在通用接口中使用。

    第二个和第三个的种类不同,这个没关系。 (默认 integerinteger(8),种类 8 不可移植,但通常与默认不同。)第一个和第二个是相同的。

    我查看了库的源代码。我的结论是,这个通用接口不符合 Fortran 90 和更高版本的标准。因此,我将首先将其更改为仅用于显式接口的常规接口块,即删除单词interface 之后的名称SORTI,并直接调用各个子例程。

    【讨论】:

    • 如果您决定将SORTIC4 中的整数声明更改为INTEGER(4),请注意问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2011-10-28
    • 2012-03-01
    • 2018-07-23
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多