Неоднозначный интерфейс в универсальном интерфейсе Фортрана

Я не знаком с Фортраном. А вот общий интерфейс с некоторыми подпрограммами. Gfortran 4.8 жалуется, что:

Неоднозначные интерфейсы "sortic4" и "sortic" в универсальном интерфейсе "sorti" в (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

Что случилось?

1 ответ

Решение

Вы первые две подпрограммы (SORTIC а также SORTIC4) имеют одинаковые типы, виды и размеры (ранги) фиктивных аргументов. Таким образом, разрешение TKR не может различать их, они неоднозначны. Они должны отличаться некоторыми из этих атрибутов, чтобы их можно было использовать в универсальном интерфейсе.

Второй и третий отличаются по своему виду, это нормально. (По умолчанию integer а также integer(8), Добрый 8 не является переносимым, но чаще всего отличается от стандартного.) Первый и второй совпадают.

Я посмотрел в исходном коде библиотеки. Я делаю вывод, что этот универсальный интерфейс не соответствует стандартам Fortran 90 и более поздним. Поэтому я бы начал с изменения его на обычный интерфейсный блок только для явного интерфейса, то есть удалил имя SORTI после слова interfaceи вызовите отдельные подпрограммы напрямую.

Другие вопросы по тегам