Неоднозначный интерфейс в универсальном интерфейсе Фортрана
Я не знаком с Фортраном. А вот общий интерфейс с некоторыми подпрограммами. 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
и вызовите отдельные подпрограммы напрямую.