class - Fortran 2008 - CLASS(*) 的用户定义 I/O 过程
问题描述
我正在尝试创建一个类型,它将作为任意其他类型的包装器,因此我可以创建一个异构数组,正如Fortran 类的异构数组和Fortran 中的创建异构数组中所建议的那样。
所以,我试着像这样实现它:
module m
implicit none
type :: container
class(*), pointer, public :: item
end type container
end module m
program mwe
use m
implicit none
type(container) :: cont
integer, target :: i
i = 5
cont = container(i)
write(*,*) cont%item
end program mwe
现在我收到错误
test4.f90(20): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
write(*,*) cont%item
----^
compilation aborted for test4.f90 (code 1)
所以我尝试像这样实现 I/O:
module m
implicit none
type :: container
class(*), pointer, public :: item
contains
procedure :: write_sample => write_container_sample_impl
procedure :: read_sample => read_container_sample_impl
generic :: write(unformatted) => write_sample
generic :: read(unformatted) => read_sample
end type container
contains
subroutine write_container_sample_impl(this, unit, iostat, iomsg)
class(container), intent(in) :: this
integer, intent(in) :: unit
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
write(unit, iostat=iostat, iomsg=iomsg) this%item
end subroutine write_container_sample_impl
subroutine read_container_sample_impl(this, unit, iostat, iomsg)
class(container), intent(inout) :: this
integer, intent(in) :: unit
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
read(unit, iostat=iostat, iomsg=iomsg) this%item
end subroutine read_container_sample_impl
end module m
program mwe
use m
implicit none
type(container) :: cont
integer, target :: i
i = 5
cont = container(i)
write(*,*) cont%item
end program mwe
但即使在我的新方法中也会出现同样的错误:
test4.f90(22): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
write(unit, iostat=iostat, iomsg=iomsg) this%item
--------^
test4.f90(31): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
read(unit, iostat=iostat, iomsg=iomsg) this%item
--------^
test4.f90(47): error #5513: A polymorphic I/O list item requires a user-defined derived-type input/output procedure.
write(*,*) cont%item
----^
所以,我有两个问题:
- 我应该如何正确实施它?
- 将项目变量声明为指针还是可分配变量更好/更容易?
解决方案
使用无限的多态实体要求很高。
为容器类型添加定义的输入/输出过程并不能解决您的问题,因为问题不在于容器本身。相反,它是容器的组件,它是多态的并且需要定义的 I/O 过程。
不幸的是,由于该组件是无限多态的,因此无法定义这样的过程。1
此外,您为容器类型定义的 I/O 过程实际上不会被使用。您只为未格式化的输入和输出定义了过程,但是write(*,*)
是(列表导向的)格式化输出。
至于如何解决这个问题:在某些时候你必须决定你的无限多态实体是什么。使用无限制的多态实体很棘手的部分原因是内在类型和派生类型不能被同等对待。与您之前的问题一样,如果您可以使用class(something_not_star)
而不是class(*)
您会发现生活更轻松。
事情如何发展,select type
可能是你最大的希望。
1定义的 I/O 过程可能只存在于派生类型。
推荐阅读
- sql - sqlite 将毫秒转换为 HH:MM:SS.SSS
- scrapy - 如何在scrapy中点击一个链接,在新页面解析一些数据然后返回上一页继续解析
- r - 情节错误(qs,道具):未使用的参数(道具)
- python - 为什么我有一个简单的应用程序 /xff 问题
- testng.xml - testng.xml 文件不执行所有方法
- javascript - Ant select如何访问key的值
- json - JQ - 在数组打印后获取另一个更高级别的键值
- javascript - mondoDB 的 Nodemon 错误:“应用程序崩溃 - 启动前等待文件更改”
- javascript - 按钮和获取请求
- java - 在聊天活动中删除消息没有任何反应