上のプログラムのkind=の部分は省略可能である。数値データの精度指定にもこのSPやDPを使う。倍精度の1.0サンプルプログラムを見てみよう。[#ke7a35f7]上のプログラムをdouble_precision_real.f95という名前のファイルに保存し、コンパイル&実行せよ。[#m1b5cd0e]C言語の構造体とほとんど同じである。type構造体のメンバにアクセスするのに%を使う。[#v75016b3]上のプログラムをtype.f90に保存し、コンパイル&実行せよ。[#maea53c2]student型の構造体変数をもう一つ(例えばst2という名前)を作り、stのデータをst2にコピーせよ。[#heae7ea1]C言語では変数の宣言はブロックの先頭にまとめて置く。(C99やC++はもっと自由だが。)Fortran90/95でも同じ。noneを省略すると「暗黙の型宣言」をしたことになる。始まる変数は整数である等のルールである。バグが入りやすいので、暗黙の型宣言は使わない方が良い。none宣言をすること。[#ife3cc0b]宣言したつもりのない変数を間違って使っていても気がつかない可能性がある。次のプログラムにはバグがある。[#i7e62dcd]上のプログラムをuse_implicit_nene.f95というファイルに書き込み、コンパイル&実行せよ。何事もないかのように正常終了する。それらしい答えを返す。noneと書いてから、コンパイルせよ。array01[NX];が大きさNXの1次元配列である。array01[NX-1]と並んでいる。array01(NX)と並ぶ。&color(#ff0000){配列のインデックスは1から始まる。全要素の和をとるFortran90/95プログラムを書け。[#xa06a740]厳密に言えばC言語では2次元配列はない。あるのは「配列の配列」である。array02[j][i]という形でアクセスできる量はある。array02のサイズ(インデックスiとjの範囲)は実行時に不定として、array02をまるごと引数で受け取る関数がC言語では作れない。従ってこれを2次元配列とは呼び難い。array02[1][NX-1]という順番で並ぶ。Fortran90/95ではarray02(i,j)という形でアクセスできる量は本物の2次元配列である。array02と宣言する。array02と宣言し、後ほど(実行時に)メモリをallocateする。array02(1,2),...に全ての要素(NX*NY個)が連続して並ぶ。配列の要素がメモリ空間中に連続してあることは、メモリへのアクセス速度が極めて重要となるスーパーコンピューティングでは極めて重要である。array03[k][j][i]が上の意味での「擬似」3次元配列である。array03とする。[#y23c3aa3]if文はC言語と似ている。下の例を見れば一目瞭然であろう。'''action'''ともできる。else-if構文も簡単である。[#t46a284d]これも下の例を見ればわかるであろう。.false.の二つをとる。[#ke7d8d5f]C言語でいうswitch文である。selectC言語では普通breakが必要だがFortran90/95のcase文には不要である。[#m30abaae]次のプログラムをcase.f95に保存し、実行せよ。[#qf910bc8]後述するが、Fortran90/95は文字列の取り扱いがC言語よりもずっと簡単である。case構文で簡単に場合分けできる。[#r051eb30]C言語でいうfor文である。上のプログラムをdo_loop.f95に保存し、increment値(上の場合2)を変えて実行せよ。[#cc535181]整数のカウンターのないdo-loopも可能である。このままだと無限ループになるので、通常はある条件を満たせばループから抜け出すようにする。C言語だとbreak文でループから抜け出す。(正確には最も内側のループから抜け出す。)Fortran90/95でbreakに相当するのはexitである。!<--+C言語ではループの先頭に戻る時にはcontinue文を使うが、それに相当するのはFortran90/95ではcycleである。case文、do文を使って自由にプログラムを作ってみよ。[#kf7c7b07]C言語と同様に関数(function)という手続き(procedure)は、Fortran90/95プログラムの重要な構成部品である。関数の使い方は以下の例を見ればわかるであろう。次のプログラムをfunction01.f95として保存し、実行せよ。function01intent(in)は引数iが入力引数であり、関数next_intの内部で変更されることがないことを保証するものである。関数を以下のように内部副プログラムとしてメインの中に含むこともできる。次のプログラムをfunction02.f95として保存し、実行せよ。(内部副プログラムについては後述。出力(返り値)が不要な場合も多い。そのようなときC言語ではvoid関数とする。Fortran90/95ではvoid関数をsubroutineと呼ぶ。'''subroutine名'''とする。[#hd2e0eb1]C言語は値渡し、Fortran90/95は参照渡しである。C言語が値渡しであることは、以下の例でkの値が変わっていないことから確認できる。}これと似たプログラムをFortran90/95で書くと以下のようになる。このプログラムは危険。call_by_referenceこのプログラムではkの値はサブルーチンincrementを読んだ後に変更されている。[#y7589b69]上の二つのプログラムをそれぞれcall_by_value.c、call_by_reference.f95という名前で保存し、実行せよ。[#t9da3a2e]値渡しに比べて参照渡しは値をコピーする必要がないので速い。従って計算速度を重視するFortran90/95言語では値渡しを採用していないのは当然である。引数として渡した変数がそのサブルーチン内部で勝手に(誤って)変更されると見つけにくいバグになり、危険である。このような事故を防ぐためにFortran90/95には引数に入出力属性をつけることができる。サブルーチンincrementの引数iは入力属性をもつと指定すると(下のプログラムの2行目)、コンパイラがエラーを出してくれる。[#sbab104c]call_by_reference.f95を上のように変更してコンパイルせよ。[#dc4f204b]入出力属性には以下の3種類がある。