В следующем примере используются функции Fortran 2003
для определения неограниченного количества полиморфных указателей и выполнения действий на основе типа переменной, следующего за конструкцией select type
. Подпрограмма handleP
выводит значение аргумента в зависимости от его типа.
program example
implicit none
type name
character(22) :: n
end type
character(len=7) :: mystring
mystring = 'Initial'
call handleP(mystring)
call handleP('Initial')
call handleP(name('Initial'))
contains
subroutine handleP(p)
class(*), intent(in) :: p
select type(p)
type is (character(len=*))
write(*,*) len(p), ': ', p
class is (name)
write(*,*) len(p%n), ': ', p%n
class default
write(*,*) 'Unknown type'
end select
end subroutine
end program example
Компиляция с gfortran
версии 4.8 дает следующий результат:
7 : Initial
0 :
22 : Initial
Итак, с call handleP(mystring)
все работает как положено, а с call handleP('Initial')
печать не работает. Вызов с аргументом type(name)
также работает.
Является ли поведение с call handleP('Initial')
ошибкой gfortran
или я делаю что-то не так? Если это ошибка, что я могу сделать, чтобы предотвратить это?
*
) - это должна быть отложенная длина (используйте:
). Если gfortran принимает это, то это ошибка компилятора. - person IanH   schedule 02.06.2014*
. - person francescalus   schedule 02.06.2014gfortran
.Gfortran
, похоже, еще не очень способен передавать строки с полиморфными указателями. - person Holger   schedule 06.06.2014