FORTRAN 規格の基本的な概念に「不定」という概念がある. これは最も重要な概念の一つでありながら, 最もわかりにくい概念でもある. FORTRANを勉強したことのある人ならば, 文法書の中の
この奇怪な文章を理解するには, FORTRANの規格の文章が誰に対する文章であるかということを, よく理解しておく必要がある. FORTRAN規格というのは, 我々プログラマに対する文章であると同時に, FORTRANコンパイラをつくる人に対する文章でもある. したがって, この文章は2通りに翻訳できるように書いてあるのである. 上記の文章を, コンパイラをつくる人に対する文章に翻訳すれば,
もし, この文章をコンパイラを「作った人」から「使う人」へのメッセージだと 解釈してしまうと, 「自分で作っておきながら, わからない, どういうことだ」 と言いたくなってしまう. 特に, コンパイラに付属の文法書を読んでいると, そのような錯覚に落ちいりやすいが, FORTRANの文法書とはあくまでも,
「不定」とは逆に, 規格によって値が保証されている状態を「確定」という. 規格上, プログラムの中で引用できる変数は「確定」された変数だけである. 以下, 変数が「不定」となる例である.
これは, 最もわかり易い「不定」の場合である. 変数に値が代入なければ, 当然その変数にどのような値が入っているかわからない.
コンパイラによっては全ての変数を初期化 (通常は0を代入) する ものもある. FORTRAN規格はあくまで「不定」である (どうしてもよい) ので, そのようなコンパイラでも規格に違反しているわけではない. しかし, これは規格によって保証されているものではなく, 一種の「方言」であるので, これに頼ってプログラムを書くと後で必ず後悔する.
最初から変数に値を入れておきたい時にはDATA文を使う. 次の例を参照のこと.
サブルーチンの中で使われる変数は, いくつかの例外を除いて, サブルーチンの実行が終了した段階で「不定」となる.
これは少々わかりにくいが, 要するに, 同じサブルーチンを2回呼んだとき, 1回目で値が代入された変数を, 2回目に参照しようとしても, 1回目の値が保存されている保証はない, ということである.
例えば, 次のプログラムを見て欲しい.
*−−−−−− main program −−−−−- DO 100 I=1, 100 CALL BEAT 100 CONTINUE END *−−−−−−−−−−−−−−−− SUBROUTINE BEAT DATA N /0/ SAVE N=N+1 IF(N.EQ.10) THEN WRITE(6,*) ' I hate you !' N=0 ENDIF ENDこのサブルーチンBEAT は呼ばれた回数(N)を覚えていて, 10回呼ばれるごとにメッセージを出力するものである.
変数NはBEATが呼ばれる前に, DATA文によって 0 という値で確定している. BEATが1回呼ばれると, この変数Nに1が加えられるが, もし, 9行目のSAVE文がなければ, 16行目のEND文を実行した段階で, FORTRANの規定により Nは不定となる.
SAVE文は, サブルーチン内の変数の値を サブルーチンの実行が終っても保持するように 指示する宣言文である. このプログラムのように変数Nの値が 次回の呼び出しまで保持されないと 正常に動かないようなプログラムでは必ず書かなければならない.
コンパイラによっては (というより多くのコンパイラでは) サブルーチンの中で使われる局所変数を保存するが, これも「方言」である.
ただし, DATA文で指定された変数は, その値が書き換えられない限り, RETURN文またはEND文を実行しても「不定」にはならない.
因みに, 地球流体電脳ライブラリの GLpGET/GLpSETが, 掲示板の役目を果たせるのは, このDATA文とSAVE文のおかげである. (1.5.4節参照.)
なお, SAVE文を指定すると, 通常, 実行ファイルのサイズは 大きくなるが, 実行速度は若干速くなることが多い.
異なる型の変数がEQUIVALENCE文などにより結合しており, その一方の変数が確定したとき, もう一方の変数は不定となる. 例えば,
INTEGER IX REAL RX EQUIVALENCE (IX, RX) RX = 1. WRITE(6,*) IX ENDというプログラムで, 実変数 RX が代入されると, 整変数IXの値は不定となる. したがって, 不定の変数を引用しているWRITE文は, 文法違反である.
しかし, この時IX は, ちゃんと「ある値」を持っている. ただし, 整数や実数の表現形式がコンパイラによって異なるため, この「ある値」が, どのような値になるかFORTRAN規格からは予測できないという意味で 「不定」なのである.
したがって, 文法上このプログラムの結果はわからないが, 通常は正常に動作して「ある値」を書き出すことになる. (1.5.4節参照.)