Параметризованный по длине передаваемый объект в процедуру с привязкой к типу имеет жалобу - PullRequest
0 голосов
/ 06 октября 2018

Я изучаю фортран и хотел бы инкапсулировать массив и подпрограмму в тип.Кажется, проблема в определении типа самообъекта.

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

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 не существует)

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

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

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

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

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

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

0 голосов
/ 06 октября 2018

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

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

...