FORTRAN(変数その1)

https://www.youtube.com/watch?v=b6dM8ZcIrSY
ドラマ『民衆の敵』

幸せになりたいから立候補、面白いですねえ。自ら幸せにならなければ人を幸せにできないとも思いますので、ありだと思います。

FORTRANの学習、今回は変数です。
私が参考にしてる1993年頃のFORTRAN入門書には変数名の規則として、「英字で始まる6文字以内」と書かれています。当時はそうだったのかもしれませんが、今はもっと長い名前が使えるようです。

takk@deb9:~$ cat var.f
      PROGRAM MAIN
      A23456789=123.45
      WRITE(*,11111) A23456789
11111 FORMAT(G10.5)
      STOP
      END
takk@deb9:~$ gfortran var.f
takk@deb9:~$ ./a.out
123.45
takk@deb9:~$

変数名の長さがどのぐらいまでいけるのか簡単なスクリプトで確認してみます。

takk@deb9:~$ cat var.pl
foreach $len ($ARGV[0]..$ARGV[1]){
$varname="A" x $len;
open(FH,">test.f");

print FH <<EOL;
      PROGRAM MAIN
      $varname=123.45
      WRITE(*,11111) $varname
11111 FORMAT(F10.2)
      STOP
      END
EOL

close(FH);
unlink "./a.out" if(-f "./a.out");
system("gfortran test.f");

print "var length=$len: ";

open(FH,"./a.out |");
print <FH>;
close(FH);
}
takk@deb9:~$

指定した変数名の長さのFORTRANプログラムtest.fを生成して、ビルド後、実行するスクリプトになっています。
引数には確認したい変数の長さ(開始、終了)を指定します。
まずは1文字の変数の確認をしてみましょう。

takk@deb9:~$ perl var.pl 1 1
var length=1:     123.45
takk@deb9:~$ 

Aという1文字の長さの変数を使ったプログラムを生成し、ビルドして実行しました。
最後にビルドしたソースは残ってますので確認してみます。

takk@deb9:~$ cat test.f
      PROGRAM MAIN
      A=123.45
      WRITE(*,11111) A
11111 FORMAT(F10.2)
      STOP
      END
takk@deb9:~$

次は2文字から10文字ぐらいを確認してみます。

takk@deb9:~$ perl var.pl 2 10
var length=2:     123.45
var length=3:     123.45
var length=4:     123.45
var length=5:     123.45
var length=6:     123.45
var length=7:     123.45
var length=8:     123.45
var length=9:     123.45
var length=10:     123.45
takk@deb9:~$ cat test.f
      PROGRAM MAIN
      AAAAAAAAAA=123.45
      WRITE(*,11111) AAAAAAAAAA
11111 FORMAT(F10.2)
      STOP
      END
takk@deb9:~$

10文字ぐらいは余裕で大丈夫ですね。
次は変数の長さを100文字にして確認してみましょう。

var length=100: takk@deb9:~$ perl var.pl 100 100
test.f:2:70:

      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=123.45
                                                                     1
Error: Name at (1) is too long
var length=100: takk@deb9:~$

あれ、100文字ではビルド通りませんね。
半分の50文字を確認してみます。

var length=100: takk@deb9:~$ perl var.pl 50 50
var length=50:     123.45
takk@deb9:~$

通りました。結果も合ってます。ではその半分の75文字をみていきます。

takk@deb9:~$ perl var.pl 75 75
test.f:2:70:

      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=123.45
                                                                     1
Error: Name at (1) is too long
var length=75: takk@deb9:~$

面倒なので51から74まで一気に確認します。

var length=75: takk@deb9:~$ perl var.pl 51 74
var length=51:     123.45
var length=52:       0.00
var length=53:       0.00
var length=54:      51.03
var length=55: **********
var length=56: **********
var length=57:       0.00
var length=58:      -0.00
var length=59: **********
var length=60:       0.00
var length=61: **********
var length=62: **********
var length=63: **********
test.f:2:70:

       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=123.45
                                                                      1
Error: Name at (1) is too long
var length=64: test.f:2:70:

64文字でビルドエラーになりましたが、その前から結果が怪しくなっています。
まあ、あまり長い名前にはしない方が良いということですね。

ちなみに、 変数名は英小文字も使えるようですが、大文字と区別されないようです。

takk@deb9:~$ cat var.f
      PROGRAM MAIN
      A23456789=123.45
      a23456789=20
      WRITE(*,11111) A23456789
      WRITE(*,11111) a23456789
11111 FORMAT(G10.5)
      STOP
      END
takk@deb9:~$ gfortran var.f
takk@deb9:~$ ./a.out
20.000
20.000
takk@deb9:~$

コメント

タイトルとURLをコピーしました