gpt4 book ai didi

io - 写语句不能在派生类型的用户定义格式化 I/O 过程中生成新行

转载 作者:行者123 更新时间:2023-12-04 23:14:00 28 4
gpt4 key购买 nike

我想在我的 Fortran 代码中为派生类型实现用户定义的 I/O 过程。但是,write这些过程中的语句不能在两个连续的 write 之间产生新行陈述。派生类型和过程定义如下。

模块:

module station_module
implicit none

character(8), parameter :: FmtFloat = '(5E15.7)'

type :: station
integer, private :: ns = 0
real, public, allocatable :: xloc(:), yloc(:), zloc(:)
contains
procedure, public :: import_station
procedure, public :: export_station
procedure, private :: read_station
generic, public :: read (formatted) => read_station
procedure, private :: write_station
generic, public :: write (formatted) => write_station
final :: destruct_station
end type station

interface station
module procedure new_station
end interface station

contains

function new_station(n) result(t)
implicit none
integer, intent(in) :: n
type(station) :: t

if (n > 0) then
allocate (t%zloc(n))
allocate (t%yloc(n))
allocate (t%xloc(n))
t%ns = n
end if
end function new_station

subroutine read_station(dtv, unit, iotype, vlist, iostat, iomsg)
implicit none
class(station), intent(inout) :: dtv
integer, intent(in) :: unit
character(*), intent(in) :: iotype
integer, intent(in) :: vlist(:)
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg

call dtv%import_station(unit)

iostat = 0
end subroutine read_station

subroutine import_station(this, unit)
implicit none
class(station), intent(inout) :: this
integer, intent(in) :: unit
character(256) :: header, footer
integer ns

read (unit, '(A)') header !> Header
read (unit, *) ns
if (ns > 0) then
if (allocated(this%zloc)) then
deallocate (this%zloc)
end if
allocate (this%zloc(ns))
read (unit, *) this%zloc

if (allocated(this%yloc)) then
deallocate (this%yloc)
end if
allocate (this%yloc(ns))
read (unit, *) this%yloc

if (allocated(this%xloc)) then
deallocate (this%xloc)
end if
allocate (this%xloc(ns))
read (unit, *) this%xloc

this%ns = ns
end if
read (unit, '(A)') footer !> Footer
end subroutine import_station

subroutine export_station(this, unit)
implicit none
class(station), intent(in) :: this
integer, intent(in) :: unit

write (unit, '(A)') ">STATION INFO"
write (unit, '(I6)') this%ns
write (unit, *) "Z:"
write (unit, FmtFloat) this%zloc
write (unit, *) "Y:"
write (unit, FmtFloat) this%yloc
write (unit, *) "X:"
write (unit, FmtFloat) this%xloc
write (unit, '(A)') ">END STATION"
end subroutine export_station

subroutine write_station(dtv, unit, iotype, vlist, iostat, iomsg)
implicit none
class(station), intent(in) :: dtv
integer, intent(in) :: unit
character(*), intent(in) :: iotype
integer, intent(in) :: vlist(:)
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg

call dtv%export_station(unit)

iostat = 0
end subroutine write_station

subroutine destruct_station(this)
implicit none
type(station), intent(inout) :: this

if (allocated(this%xloc)) then
deallocate (this%xloc)
end if
if (allocated(this%yloc)) then
deallocate (this%yloc)
end if
if (allocated(this%zloc)) then
deallocate (this%zloc)
end if
this%ns = 0
end subroutine destruct_station

end module station_module

我们可以看到用户自定义的 格式化写入 语句只调用一个名为 export_station 的常规子程序,我希望这两种方式都得到相同的结果。

这是我的 测试程序:
program Test
use station_module
implicit none
type(station) :: pt, pt1, pt2

pt = station(4)

write(*, *) pt

call pt%export_station(6)

end program Test

输出:
 >STATION INFO     4Z:  0.0000000E+00  0.0000000E+00  0.0000000E+00  0.0000000E+00
Y: 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00X: 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00>END STATION
>STATION INFO
4
Z:
0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00
Y:
0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00
X:
0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00
>END STATION

常规子程序 export_station产生我所期望的。在两个 write 之间产生新的生产线语句,而 write派生类型的声明没有。

最佳答案

英特尔论坛上也有人问过这个问题。我在那里回答。“用户定义的派生类型 I/O 都是非高级的(你不能改变它)。如果你想要换行,你必须明确地写出来(例如使用/格式。)”

关于io - 写语句不能在派生类型的用户定义格式化 I/O 过程中生成新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978022/

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