LoginSignup
9
6

More than 5 years have passed since last update.

【fortran】行番号は使ってはならない

Last updated at Posted at 2017-04-26

はじめに

fortranはパンチカードでプログラミングしていた時代からある言語なので、しばしばそのころの名残が仕様に残っていることがある。数万行にも及ぶ大規模コードも扱う現代では、可読性や保守性を落とす古いコーディングスタイルは一掃しなければならない。
しかしfortranは科学技術計算に用いられるという特性から、「大学の大先生の古いスタイルが、初めてコードに触れる学生に引き継がれる」という悪夢のような悪循環が起こっている。その一つが、「行番号による制御」だ。

例1:do文をcontinue文で閉じる

大先生レベルの年齢の人が書くコード。

BadEx01.f90
do 10 i=1,10
do 20 j=1,10
   write(6,*) i+j
20 continue 
10 continue

問題点

  • continueを閉じる10,20を逆につけるバグが非常に多い(上が10,20と並んでいるから同じ並びにしたくなる)
  • 特にループの中が長くなるとどのcontinue文がどのdo文を閉じているのかわからなくなる
  • エディタの自動整形機能が働かないことがある

改善点
do文は必ずend doで閉じましょう。

GoodEx01.f90
do i=1,10
   do j=1,10
      write(6,*) i+j
   end do 
end do

例2:goto文でループを抜ける

実際に指導をする割と若い先生でもやりがちなコード。

BadEx02.f90
do i=1,10
   if(f(i) > 0) goto 30
end do
30 continue

問題点

  • コードが長くなるとどこに飛ぶかわからなくなる
  • continueがループの中か外かで指す意味が変わるので、可読性が落ちる

改善点
ループを抜けるときはexitを使いましょう。

GoodEx02.f90
do i=1,10
   if(f(i) > 0) exit
end do

行番号を使わざるを得ない所

ここまで行番号を使ってはいけないと述べてきたが、残念なことにfortranにはいまだに行番号を使わなければならない機能が残っている。

1.format文

書式を指定するformat文は行番号で指定する必要がある。

Ex03.f90
100 format(f10.4)

!...

write(6,100) x

!...

write(10,100) y

書式を使いまわすケースはあまりないので、write文の中に直接書いておくのがよいだろう。

2.read文のEOF検知

ファイルの入力に使うread文ではendオプションでEOFを検知することができる。しかしEOF検知後に行う処理を行番号で飛ばす必要がある。

read(10,*,end=1000) x
1000 continue

マジックナンバーは可読性を落とすので、何か変数に入れてしまいたいところだが、残念なことに変数をendに渡すことはできない。

可読性を極力保つには、上記のようにread文の直下を指定するのがよい。あまり遠くを指定するとどういう処理をしているのかわけがわからなくなる。

9
6
0

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
9
6