[Fortranのはじめ方] Part6: 変数宣言と暗黙の型

Fortran

はじめに

プログラミングでは、計算結果やデータを一時的に保存しておくために「変数」を使います。Fortranでも、変数を使う前には基本的に「こういう名前で、こういう種類のデータを入れますよ」と宣言する必要があります。今回は、その変数宣言の方法と、Fortranの歴史的な特徴である「暗黙の型」について学びましょう!💡

変数の宣言方法

Fortranで変数を使うには、プログラムの宣言部(通常はprogram文やsubroutine文、function文の直後)で、どのデータ型(種類)の変数を、どの名前で使うかを宣言します。基本的な書き方は次の通りです。

データ型 :: 変数名1, 変数名2, ...

:: (コロン2つ) は、型宣言と変数名を区切る記号です。省略可能な場合もありますが、属性を指定したり初期化したりする場合は必須になるため、常に付けておくのが現代的な書き方でおすすめです。

主なデータ型には次のようなものがあります。

  • INTEGER: 整数
  • REAL: 実数(単精度)
  • DOUBLE PRECISION: 実数(倍精度、REAL*8REAL(KIND=...) などで精度を指定することも多い)
  • COMPLEX: 複素数
  • CHARACTER: 文字列
  • LOGICAL: 論理値 (.TRUE. または .FALSE.)

宣言の例

具体的な宣言の例を見てみましょう。

program variable_declaration_example
  implicit none ! 暗黙の型宣言を無効にする(後述)

  ! === 変数宣言 ===
  integer :: count              ! 整数型の変数 count
  real :: temperature          ! 単精度実数型の変数 temperature
  double precision :: pi_value ! 倍精度実数型の変数 pi_value
  complex :: complex_number   ! 複素数型の変数 complex_number
  character(len=80) :: message ! 長さ80の文字列型変数 message
  logical :: is_finished      ! 論理型の変数 is_finished

  ! 複数の変数をまとめて宣言
  integer :: i, j, k
  real :: x, y, z

  ! === 宣言と同時に初期化 ===
  integer :: year = 2025
  double precision, parameter :: gravity = 9.80665d0 ! 定数として宣言(parameter属性)

  ! (プログラムの処理本体 ... )

end program variable_declaration_example

CHARACTER型では、(len=...) のようにして文字列の最大長を指定します。省略すると長さ1になります。

= 初期値 のように、宣言と同時に値を設定(初期化)することもできます。

parameter 属性を付けると、その変数はプログラム中で値を変えられない「定数」として扱われます。定数名は大文字で書く慣習もあります。

暗黙の型宣言 (Implicit Typing) と `implicit none`

Fortranには、歴史的な経緯から「暗黙の型宣言」というルールが存在します。これは、変数を明示的に宣言しなくても、変数名の最初の文字によって型が決まるというものです。

  • 変数名が i, j, k, l, m, n のいずれかで始まる場合 → INTEGER
  • それ以外の文字 (ah, oz) で始まる場合 → REAL

例えば、次のようなコードは、暗黙の型宣言が有効な場合、コンパイルエラーにはなりません。

program implicit_example
  ! implicit none がない場合

  count = 10   ! c で始まるので REAL 型とみなされる (10.0 が代入される)
  index = 5    ! i で始まるので INTEGER 型とみなされる

  result = count * index ! REAL型 * INTEGER型 の計算

  print *, result

end program implicit_example

なぜ `implicit none` を使うべきか? 🚨

暗黙の型宣言は、一見すると変数を宣言する手間が省けて便利なように思えるかもしれません。しかし、現代のプログラミングにおいては、バグの温床となりやすく、非推奨とされています。

暗黙の型宣言の問題点:
  • タイプミスによるバグ: 変数名を打ち間違えた場合、意図しない新しい変数が暗黙的に作られてしまい、エラーにならず気づきにくいバグの原因となります。
  • 可読性の低下: コードを見ただけでは、変数がどの型なのか即座に判断しにくくなります。
  • 意図しない型: 例えばループカウンタに counter という名前を付けたい場合、暗黙の型宣言では REAL 型になってしまい、不適切です。

これらの問題を避けるため、プログラムの宣言部の最初に必ず

implicit none

と書くことが強く推奨されます。implicit none を記述すると、暗黙の型宣言が無効になり、宣言されていない変数を使おうとするとコンパイルエラーが発生します。これにより、タイプミスなどの単純なミスを早期に発見でき、コードの信頼性と保守性が大幅に向上します。💪

今後の学習では、必ず implicit none を書く習慣をつけましょう!

`implicit none` を使った例

先ほどの例に implicit none を追加すると、変数宣言がないためコンパイルエラーになります。

program implicit_none_example
  implicit none ! 暗黙の型宣言を無効化

  ! count = 10   ! エラー: 変数 'count' が宣言されていません
  ! index = 5    ! エラー: 変数 'index' が宣言されていません

  ! result = count * index ! 当然ここもエラー

  ! print *, result

  ! 正しく動かすには、変数を宣言する必要がある
  integer :: index
  real :: count, result

  count = 10.0 ! 実数なので .0 をつけるのが望ましい
  index = 5
  result = count * real(index) ! 型を揃える (暗黙の型変換もあるが明示的な方が良い場合も)

  print *, result

end program implicit_none_example

エラーが出ることで、宣言忘れやタイプミスに気づくことができます。

まとめ

  • Fortranでは、変数を使う前にデータ型と変数名を宣言するのが基本です。
  • 宣言は データ型 :: 変数名 の形式で行います。
  • Fortranには歴史的な「暗黙の型宣言」ルールがありますが、バグの原因となりやすいため非推奨です。
  • プログラムの最初に implicit none を書くことで暗黙の型宣言を無効化し、すべての変数の宣言を必須にすることが強く推奨されます。これによりコードの安全性が高まります。

変数宣言と implicit none の使い方をマスターして、安全で読みやすいFortranプログラムを書いていきましょう!😊

コメント

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