non-default derived-type input/output
DT の引数に、文字列と整数を書けるのですが、それを用いてさまざまな出力制御が可能になります。また自由書式も可能になっています。
思ったより便利そうな機能です。
出力結果
ソース・プログラム
module m_test implicit none type :: t_test integer :: i, j contains procedure :: wr generic :: write(formatted) => wr end type t_test contains subroutine wr(dtv, unit, iotype, vlist, iostat, iomsg) class(t_test), intent(in) :: dtv integer, intent(in) :: unit character(len = *), intent(in) :: iotype integer, intent(in) :: vlist(:) integer, intent(out) :: iostat character(len = *), intent(in out) :: iomsg ! character(len = 20) :: fmt if (iotype == 'LISTDIRECTED') then write(unit, *, iostat = iostat) dtv%i, dtv%j else if (iotype == 'DTtest') then write(fmt, '(a, g0, a, g0, a)') '(i', vlist(1), ', i', vlist(2) ,')' print *, trim(fmt) write(unit, fmt, iostat = iostat) dtv%i, dtv%j else if (iotype(1:2) == 'DT') then write(fmt, '(a, g0, a, g0, a)', iostat = iostat) '(i', vlist(1), ', i', vlist(2) ,')' write(unit, fmt) dtv%i, dtv%j else print *, 'namelist not supported' end if return end subroutine wr end module m_test program testDT use m_test implicit none type(t_test), allocatable :: test allocate(test, source = t_test(12, 345)) print *, test print '(DT"test"(4, 4))', test print '(DT(8, 8))', test stop end program testDT