gpt4 book ai didi

class - Fortran 2008 - 用户定义的 CLASS(*) I/O 过程

转载 作者:行者123 更新时间:2023-12-01 01:44:48 24 4
gpt4 key购买 nike

我正在尝试创建一个类型,它可以作为任意其他类型的包装器,所以我可以创建一个异构数组,正如 Heterogeneous array of Fortran classes 中所建议的那样。和 Creating heterogeneous arrays in 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
----^

所以,我有两个 问题 :
  • 我应该如何正确实现它?
  • 将 item 变量声明为指针或可分配变量是否更好/更容易?
  • 最佳答案

    使用无限的多态实体要求很高。

    为容器类型添加定义的输入/输出过程并不能解决您的问题,因为问题不在于容器本身。相反,它是容器的组件,它是多态的并且需要定义的 I/O 过程。

    不幸的是,由于该组件是无限多态的,因此无法定义这样的过程。 1

    此外,实际上不会使用为容器类型定义的 I/O 过程。您只为未格式化的输入和输出定义了过程,但是 write(*,*)是(列表导向)格式的输出。

    至于你如何解决这个问题:在某些时候你必须决定你的无限多态实体是什么。使用无限多态实体很棘手的部分原因是内在类型和派生类型不能被同等对待。与您之前的问题一样,如果您可以使用 class(something_not_star)而不是 class(*)你会发现生活更轻松。

    随着事情的发展,select type可能是你最大的希望。

    1 定义的 I/O 过程可能只存在于派生类型。

    关于class - Fortran 2008 - 用户定义的 CLASS(*) I/O 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50717662/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com