Использование указателя производного типа и полиморфной цели в Фортране

Перечисленная ниже функция Fortran компилируется и выполняется, как ожидалось, с использованием ifort 11.1. Однако GFortran 4.6 возвращает ошибку компилятора:

THIS_NML => ЭТО
Ошибка: разные типы в назначении указателя в (1); попытка присвоения CLASS (UNIT) ТИПУ (UNIT).

Код Фортрана:

FUNCTION PROCESS_COMMAND(THIS, CMD, DATA) RESULT(RET)
   CLASS(UNIT), INTENT(INOUT), TARGET :: THIS
   CHARACTER(LEN = *), INTENT(IN)     :: CMD
   CHARACTER(LEN = *), INTENT(IN)     :: DATA
   CHARACTER(LEN = 200)               :: STRING
   INTEGER                            :: IOS
   TYPE(UNIT), POINTER                :: THIS_NML

   ! CREATE A NAMELIST
   NAMELIST /VARS/ THIS_NML
   THIS_NML => THIS  
   RET = 0
   STRING = '&VARS THIS_NML%' // TRIM(CMD) // ' = ' // TRIM(DATA) // ' /'

   ! READ CMD AND DATA
   READ(STRING, NML=VARS, IOSTAT=IOS)
   RET = IOS

END FUNCTION PROCESS_COMMAND

Поскольку списки имен не могут быть созданы с использованием полиморфных объектов, указатель производного типа THIS_NML используется для создания списка имен. Есть идеи, как заставить это работать с GFortran?


person mannyburet    schedule 11.03.2012    source источник


Ответы (1)


Попробуйте использовать конструкцию select type. Что-то типа

select type ( A => THIS )
   type is ( UNIT )
      Here you can treat A as nonpolymorphic variable of type UNIT (if the test is succesful).
end select
person Vladimir F    schedule 12.03.2012
comment
Спасибо! Это компилируется и запускается как в gfortran 4.6, так и в ifort 11.1. - person mannyburet; 13.03.2012