2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

配列を1行にn個ずつ出力する

Last updated at Posted at 2014-12-08

※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

 
これが一番よさげかな…?

ペーペーにはこんなもんですが,他にいい方法ないですかね?(反復に変数使う方法,調べても出てこない…)

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?