liudy02 发表于 2018-12-29 12:01:18

默认i/o号以及派生类型非默认i/o定义的问题

小白再次在此请教各位大佬两个问题:
1.我似乎在哪里听说现在的Fortran有办法可以返回默认的输出输出unit号是哪个,可是在各种教材上又找不到
还请大佬们指教一下
2.是派生类型似乎可以自行定义i/o格式符,并且可以和其他类型在一个语句里混用
但是各个教材里都没有很详细地解释这个东西到底怎么用,
能不能有哪个大佬能指点下,给个能用详细例子介绍这个功能怎么用的就好了
重点主要是不太了解iotype和v_list这两个东西是怎么联合起来使用,使得能像内置数据类型i/o的format控制符那么用
另外,也不理解是不是可以通过这种方式能够改变对type类型的表控(*)输入输出格式方式


li913 发表于 2018-12-29 12:50:49

1、program test
use iso_fortran_env
implicit none
print*,input_unit,output_unit !输入输出通道号,ivf输出 56
end
2、《Fortran95/2003程序设计》chapman,第14.8节。

li913 发表于 2018-12-29 14:21:27

iotype 里面保存了自定义格式,f2008标准中建议 v_list 为输出域宽,其实没多大用。
module fmt_m
implicit none
type UDT
    real x, y
    integer ind
contains
    procedure::write_UDT
    generic :: write(formatted) => write_UDT
end type
contains
subroutine write_UDT(dtv,unit,iotype,v_list,iostat,iomsg)
implicit none
class(UDT), intent(in):: dtv
integer,intent(in):: unit
character(*),intent(in)::iotype
integer,intent(in)::v_list(:)
integer,intent(out)::iostat
character(*),intent(inout)::iomsg

select case(iotype(1:2))
    case('LI') !listdirected
      write(unit,*) dtv%x, dtv%y, dtv%ind
    case('DT')
      write(unit,fmt='('//iotype(3:)//')') dtv%x, dtv%y, dtv%ind
    case('NA') !namelist
      !自己写代码
    end select
end subroutine
end module

program test
use iso_fortran_env
use fmt_m
implicit none
type(UDT)::t=udt(1.2,3.1,3)
print*,input_unit,output_unit !屏幕输入输出通道号,ivf为 56
write(output_unit,'( dt"f4.1,f8.1,i5" )') t
write(output_unit,*) t
pause
end program

liudy02 发表于 2018-12-29 15:01:59

li913 发表于 2018-12-29 14:21
iotype 里面保存了自定义格式,f2008标准中建议 v_list 为输出域宽,其实没多大用。


太感谢了,总算有点明白了,非常感谢……
页: [1]
查看完整版本: 默认i/o号以及派生类型非默认i/o定义的问题