gfortran жалуется на переданный объект с параметрами длины в процедуру с привязкой к типу

Я изучаю Фортран и хочу инкапсулировать массив и подпрограмму в тип. Проблема, по-видимому, заключается в определении типа самообъекта.

Это минимальный тестовый пример, который я придумал:

module testing
  implicit none

  type test(para)
    integer, len :: para
    real, dimension(para) :: weights

  contains
    procedure :: testing => testing_test
  end type
contains
  subroutine testing_test(self)
    class(test(*)) :: self
  end subroutine
end module

Компиляция этого с помощью gfortran вызывает эту ошибку:

module_test.f08:9:23:

  procedure :: testing => testing_test
          1
Error: Argument ‘self’ of ‘testing_test’ with PASS(self) at (1) must be of the derived-type ‘test’

Он работает, когда длина массива фиксирована (поэтому type%para не существует)

То, что я пытаюсь сделать (тип с массивом переменного размера и связанной процедурой), просто невозможно, или я что-то упустил в отношении определения фиктивного аргумента?


person GammaSQ    schedule 06.10.2018    source источник
comment
Вероятно, это ошибка компилятора. Какую версию gfortran вы используете? PDT был включен gfortran недавно, и все еще остались некоторые ошибки.   -  person Rodrigo Rodrigues    schedule 06.10.2018
comment
результат gfortran --version: GNU Fortran (GCC) 8.1.1 20180712 (Red Hat 8.1.1-5)   -  person GammaSQ    schedule 06.10.2018


Ответы (3)


Спасибо @Rodrigo за идею, я наконец нашел эту ошибку (и исправление): https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82943

Чтобы решить эту проблему, загрузите исходный код, примените указанный патч и скомпилируйте свой собственный gfortran. (Или дождитесь, пока он появится в репозиториях)

person GammaSQ    schedule 06.10.2018

На самом деле это не ответ, но может дать решение для некоторых. gfortran-10 все еще имеет ту же проблему. Однако flang-7 компилирует этот пример, и он доступен для Ubuntu с 19.10 и, возможно, для других ОС: э.

person Jonatan Öström    schedule 05.05.2020
comment
Было так много фланцев, что для меня это беспорядок. Это новый фланг или старый фланг отсюда fosdem.org/2020/schedule/event/llvm_flang/attachments/slides/ ? - person Vladimir F; 06.05.2020
comment
На packages.ubuntu.com/source/focal/flang написано flang (20190329- 5) таким должен быть старый фланец. Но не уверен. - person Jonatan Öström; 06.05.2020

предыдущий ответ указывает на отчет об ошибке и исправление для gfortran. Однако стоит сказать, что это стандартный код Fortran (2003).

Здесь у нас есть процедура с привязкой к типу с фиктивным аргументом переданного объекта. Основные ограничения такого аргумента заключаются в том, что он:

  • скаляр,
  • нераспределяемый,
  • объект без указателя,
  • со всеми принятыми параметрами типа длины.

Кроме того, поскольку тип является расширяемым, фиктивный аргумент передаваемого объекта должен быть полиморфным.

Для примера вопроса все условия соблюдены.

person francescalus    schedule 07.10.2018