在Fortran中使用派生类型指针和多态目标 [英] Using a derived type pointer and a polymorphic target in Fortran

查看:645
本文介绍了在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的工作?

解决方案

尝试使用选择类型

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆