Неоднозначный интерфейс при использовании необязательных аргументов в Gfortran - PullRequest
0 голосов
/ 11 декабря 2018

Я только что наткнулся на эту ошибку при компиляции небольшого количества кода, который я использовал без проблем уже целую вечность.Я использую Gfortran 8.2 в Linux и подозреваю, что обновление компилятора вызвало проблему.

Когда я определяю интерфейс с необязательным аргументом, который имеет другое количество необязательных аргументов, Gfortran жалуется, чтоИнтерфейс неоднозначен.Например, если я скомпилирую следующее, я получу «Неоднозначные интерфейсы в универсальном интерфейсе« test »для« testinit1 »в (1) и« testinit2 »в (2)»:

module test_mod
implicit none

interface Test
    module procedure test1, test2
end interface

contains

function test1(opt) result(rslt)
    integer :: rslt
    integer, optional :: opt
    rslt = 1
end function

function test2(data, opt) result(rslt)
    integer :: rslt
    integer :: data
    integer, optional :: opt
    rslt = data
end function

end module

Если удалитьнеобязательный аргумент opt, тогда он компилируется нормально.Если я добавлю data аргумент к test1, который имеет ранг, отличающийся от данных test2, то он прекрасно скомпилируется.Если я добавлю другой необязательный аргумент в обе функции, я получу одно и то же сообщение об ошибке.

Фактический код, с которым я наткнулся, - это Result интерфейс в этом файле , который,как я уже говорил, раньше компилировал как положено.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 11 декабря 2018

Гфортран жалуется, что интерфейс неоднозначный

Ну, это потому, что интерфейс является неоднозначным.Какую процедуру выбрать в следующем вызове?

integer :: param
print *, Test(param)
  1. test1 с включенным аргументом opt?Или ...
  2. test2 с аргументом data пройден и opt отключен?

Если сбой начался только после обновления, это, вероятно, былоочень долгожданное исправление ошибки.

Если я уберу необязательный аргумент opt, то он прекрасно скомпилируется.Если я добавлю аргумент данных в test1, который имеет другой ранг, чем данные test2, то он скомпилируется нормально.

Имеет смысл.Без необязательного аргумента обе функции совершенно однозначны по количеству аргументов.Изменение ранга аргумента также вызывает дифференциацию.

Если я добавлю другой необязательный аргумент в обе функции, я получу одно и то же сообщение об ошибке.

Та же проблема.Если бы обе функции имели дополнительный необязательный аргумент с соответствием type-kind-rank, как бы вы разрешили вызов?Предположим, что новый аргумент data_extra:

print*, Test(param1, param2)
  1. test1 с аргументом data_extra пройден и opt включен?Или ...
  2. test2 с аргументами data и data_extra переданы и opt отключены?
...