※3/18追記
- 大前提なはずのデータの宣言を間違っていたので修正.
- 上記に伴い各例修正
- コメントを参考に方法を一つ追加
1次元の配列xに対して,1行にdim個,line_num行出力する.
プログラム骨組み
program main
integer, parameter :: dim = 3, line_num = 51
integer :: x(dim*line_num)
open(11, file='data.dat', status='old')
read(11,*) x
close(11)
!
! 主にここに追記
!
end program main
要素をdim個改行をせずに出力し,その後に改行する方法
二重ループを用いて
do i=0,line_num-1
do l = 1, dim
write(6, '(I4)', advance='no') x(i*dim+l)
end do
write(6, '()')
end do
無理矢理反復を使う方法(これより4つ目の方法を推奨)
反復を用いて
do i=0,line_num-1
write(6,'(1000I4)') x(i*dim+1:(i+1)*dim)
end do
反復の指定をとりあえず大きい値で指定してます.
実行時間的にも一つ目よりこっちのが早い.当然,dimが1000個を超えるとダメ.
書式を気にしないなら
結局
do i=0,line_num-1
write(6,*) x(i*dim+1:(i+1)*dim)
end do
これでいい.dimの制約もないし,こっちのが早い.
※コメントを参考に追記
出力formatをcharacterで定義する方法
formatをcharacterとして定義
character :: cdim*20 !これは宣言に
write(cdim, *) dim
cdim = '('//trim(adjustl(cdim))//'I4)'
write(6, cdim) x
これが一番よさげかな…?
ペーペーにはこんなもんですが,他にいい方法ないですかね?(反復に変数使う方法,調べても出てこない…)