1.5.5 文字型変数とその他の変数の違い

前節では実変数, 整変数, 論理変数を混同した書き方をしても, 大きな問題にならなかった. これは, FORTRAN規格により, これら3つの型のデータが全て 「1数値記憶単位を占める」と規定されているからである. これに対して, 文字型のデータは1文字が「1文字記憶単位を占める」 と規定されている. 多くの処理系においては「1数値記憶単位」は32ビットの「1ワード」に対応し, 「1文字記憶単位」は8ビットの「1バイト」に対応するが, 規格の中で具体的な長さは規定されていない. したがって, 文字型とその他の変数をEQUIVALENCE文で結合したりすると, 規格上, 「数値記憶単位」が「文字記憶単位」のいくつ分に 相当するかわからないため, そのような結合は禁じられている.

さらに, これは規格上の話だけではなく, 上記のような1ワードが4バイトに相当する標準的な処理系で, ユーザーが「数値記憶単位」と「文字記憶単位」の対応をよく考えた上で 結合したとしても実害が生じる場合がある. これは, 文字型変数が文字単位で任意の長さがとれることから, 文字型変数の扱い方が, それ以外の変数(実数, 整数, 論理変数)と 大きく異なる場合があるからである. 特にサブルーチンの引数の渡し方が異なる場合が多い.

もともとFORTRAN66の規格には文字型変数はなく, 文字を扱う場合にはキャラクターコード列(整数)として扱われていた (4文字を1つの整数として扱っていた). そのため4文字単位の長さの文字列しか扱えず不便であったが, FORTRAN77から文字型変数として正式に認知されるようになった. これに伴って, 任意の長さの文字列が扱えるようになるなど, 文字の扱いが非常に楽になった反面, 上記のような制約も増えた. もっとも, かなり多くのコンパイラでは文字型とそれ以外の変数の 結合が可能であるが, これも「方言」の一つである.

実際の観測データなどを扱う分野では, 文字と数字が混在したデータを扱うことも少なくないので, 伝統的にこのようなEQUIVALENCE文を使っている場合もあるが, 実際にこのような結合ができないコンパイラもあるので, 注意が必要である.

さらに, 文字型変数は他の型の変数と違って, 以下の例のように, 同じ文字要素を式の右辺と左辺に書く(3行目)ことが禁じられている.

  
      CHARACTER*12 CX
      CX = 'DENNOU'
      CX = CX(1:6)//'DENNOU'

文字以外の変数では, 同様のことが許されているので, つい, このような代入文を書いてしまいそうになるが, このような場合には,

 
      CHARACTER*12 CX
      CX = 'DENNOU'
      CX(7:12) = 'DENNOU'

とすれば, 問題はない.