Параметризованные производные типы с параметром kind в качестве аргумента подпрограммы - PullRequest
0 голосов
/ 02 июля 2018

Скажем, у нас есть следующий код:

module foo
use :: iso_fortran_env
implicit none

type :: bar (p, q)
    integer, kind :: p
    integer, len  :: q
    integer(kind = p), dimension(q) :: x
end type bar

contains

subroutine barsub (this)
    class(bar(*,*)), intent(in) :: this
    write (*,*) this%x
end subroutine barsub

end module foo

Этот код не компилируется ни с gfortran 8, ни с pgfort 18.4. Компилятор pgi говорит

Недопустимый селектор - значение KIND должно быть неотрицательным Предполагаемый параметр типа (*) нельзя использовать с параметром типа не-длины p

тогда как гфортран дает

Параметр KIND 'p' в (1) не может быть либо ПРИНЯТ, либо ОТЛОЖЕН

Если я изменю код выше на

subroutine barsub (this)
    class(bar(INT32,*)), intent(in) :: this
    write (*,*) this%x
end subroutine barsub

прекрасно компилируется с обоими компиляторами.

Можно ли написать подпрограмму, в которой параметр kind не требуется указывать явно? В приведенном выше примере код будет таким же для INT32, INT64, ... и я не хочу копировать и вставлять его для каждого мыслимого значения параметра kind. Работает нормально по параметру len. Почему я не могу сделать то же самое с параметром kind?

1 Ответ

0 голосов
/ 02 июля 2018

Можно ли написать подпрограмму, в которой параметр kind не требуется указывать явно?

Нет, параметры типа kind должны быть заданы константным выражением или заданы по умолчанию, см., Например, стандарт Fortran 2008, определение 1.3.147.12.3.

Почему я не могу сделать то же самое с параметром kind?

Тот факт, что параметры типа len и kind имеют различное использование и требования, является причиной наличия двух типов параметров типа, если бы их характеристики были одинаковыми, нам не понадобилось бы два из них.

Обратите внимание, что процедуры требуют от kind параметров своих фиктивных аргументов параметризованных производных типов точно так же, как они требуют от kind s их фиктивных аргументов внутренних типов: чтобы их значения были определены во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...