在Fortran中使用派生类型指针和多态目标 [英] Using a derived type pointer and a polymorphic target in Fortran
问题描述
下面列出的Fortran函数使用ifort 11.1编译并执行。但是GFortran 4.6会返回编译器错误:
$ b
THIS_NML =>这是
错误: 1);尝试将CLASS(UNIT)分配给TYPE(UNIT)。
Fortran代码:
FUNCTION PROCESS_COMMAND(THIS,CMD,DATA)RESULT(RET)
CLASS(UNIT),INTENT(INOUT),TARGET ::
CHARACTER LEN = *),INTENT(IN):: CMD
CHARACTER(LEN = *),INTENT(IN):: DATA
CHARACTER(LEN = 200):: STRING
INTEGER :: IOS
TYPE(UNIT),POINTER :: THIS_NML
!创建一个名称
NAMELIST / VARS / THIS_NML
THIS_NML => THIS
RET = 0
STRING ='& VARS THIS_NML%'// TRIM(CMD)//'='// TRIM(DATA)//'/'
!读取CMD和数据
READ(STRING,NML = VARS,IOSTAT = IOS)
RET = IOS
END FUNCTION PROCESS_COMMAND
因为namelist不能使用多态对象创建,所以派生类型指针 THIS_NML
用于创建名单。任何想法如何使这与GFortran的工作?
尝试使用选择类型$ c $构造。类似于
select type(A => THIS)
类型是(UNIT)
在这里,可以将A视为UNIT类型的非多变量变量(如果测试成功)。
结束选择
The Fortran function listed below compiles and executes as expected using ifort 11.1. However GFortran 4.6 returns the compiler error:
THIS_NML => THIS
Error: Different types in pointer assignment at (1); attempted assignment of CLASS(UNIT) to TYPE(UNIT).
Fortran code:
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
Because namelist's cannot be created using polymorphic objects, the derived type pointer THIS_NML
is being used to create the namelist. Any ideas how to make this work with GFortran?
Try using select type
construct. Something like
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
这篇关于在Fortran中使用派生类型指针和多态目标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!