Скажем, у нас есть следующий код:
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?