導入:なぜCHARACTER(LEN=)が重要なのか
Fortranで文字列を扱う際、あらかじめ長さを決めておく必要がありますが、すべての文字列が同じ長さとは限りません。もし長さが固定された引数しか使えないと、短い文字列を扱うために大きなメモリを無駄にしたり、逆に長い文字列を渡そうとしてエラーになったりします。
CHARACTER(LEN=)を使うことで、呼び出し側の文字列長をそのまま引き継ぐことができるようになります。これにより、汎用的な文字列処理関数を作成でき、コードの再利用性が劇的に向上します。
基礎知識:LEN=とは何か
通常、Fortranで文字列を宣言する際は「character(len=20) :: str」のように長さを指定します。しかし、サブルーチンや関数の引数において「len=」と指定すると、「渡された文字列の長さに自動的に合わせる」という特別な命令になります。
内部的には、コンパイラが「文字列の先頭アドレス」に加えて「文字列の長さ」を保持する隠れた情報(記述子:Descriptor)を渡すことで、この動的な挙動を実現しています。
実装:柔軟な文字列処理のための手順
実装は非常にシンプルで、サブルーチンの引数定義で長さをアスタリスクにするだけです。注意点として、この指定は引数(仮引数)に対してのみ有効であり、関数内で新しい変数を宣言する際には使えません。もし関数内で一時的に文字列を作りたい場合は、元の文字列の長さを「len(msg)」で取得して利用します。
サンプルプログラム:文字列を加工する汎用サブルーチン
以下のコードは、どんな長さの文字列を渡しても、その長さを自動認識して表示するサンプルです。コピー&ペーストして動作を確認してみてください。
program test_char
implicit none
character(len=10) :: short_str = "Hello"
character(len=20) :: long_str = "Fortran Programming"
! 異なる長さの文字列を渡しても正常に動作します
call print_msg(short_str)
call print_msg(long_str)
contains
subroutine print_msg(msg)
! len= により、呼び出し側の長さを自動的に引き継ぎます
character(len=), intent(in) :: msg
! len()関数を使うと、現在の文字列長を取得できます
print , "文字列の内容: ", trim(msg)
print , "文字列の長さ: ", len(msg)
print , "-----------------------"
end subroutine print_msg
end program test_char
応用・注意点:現場で役立つアドバイス
1. intent(in)の活用: 文字列の内容を変更しない場合は、必ず「intent(in)」を付与しましょう。これにより、意図しない書き換えを防ぐだけでなく、コンパイラの最適化も促進されます。
2. len()関数の活用: 「len(msg)」を使えば、文字列の最大長(宣言時の長さ)が取得でき、「trim(msg)」を組み合わせれば、空白を除いた実質的な長さを計算することも可能です。
3. 陥りやすいバグ: 誤って「character(len=) :: my_str」のようにローカル変数を宣言しようとすると、コンパイルエラーになります。len=はあくまで「受け取る側の窓口」であると覚えておきましょう。
この技術をマスターすれば、より洗練された、メンテナンス性の高いFortranコードが書けるようになります。ぜひ活用してください。

コメント