Windows上でgcc-gfortranを走らせる。

自由形式

(行番号等を書き込むために) 行頭の6カラムを空欄にする「固定形式」ではなく、 好きなところから書き始めていい「自由形式」で書いた場合は、

g77 -ffree-form -o hoge hoge.f

でコンパイルできる。但し、vi等のエディターは拡張子が.fだとf77と判断するので、 初めての編集の際には、 6カラム内に書き込まれたコマンド文字列をエラーと判断した色付けをしてしまう。 が、自由形式で数行以上書かれたファイルであれば、拡張子が.fであっても、 自由形式として識別して色分けしてくれるようだ。 だから初めてプログラムを書きはじめるときは、 まず、数行だけ書いて一旦 保存してから開き直せばいいのではないかと思う。 geditだと拡張子.fの自由形式でもちゃんと識別して色分けしてくれるようだ。 これなら、.bashrcに

alias g77f='g77 -ffree-form'

と書いておけば、自由形式で書いたhoge.fは、g77f -o hoge hoge.fでコンパイルできる。

自由形式の継続行

自由形式で複数の行にまたいで書く場合は、前の行の行末と次の行の行頭に&を付ける。

print*,'x方向の要素数と&
&y方向の要素数を入れてください'

暗黙の宣言の無効化

implicit none が使える。 バグ防止のためには、implicit noneにしてから、個々の変数をいちいち realやintegerで宣言することを推奨(そうすれば、宣言してない変数を使った時点で コンパイルエラーが出てくれる)。 めんどくさがりやの後藤が使うimplicit rea*8(a-h, o-z)は教育的ではない。

表計算ソフトのcsvデータなどの桁を揃えてTeX書式に出力する例

http://www.str.ce.akita-u.ac.jp/~gotou/programoj/keikan/keta.f

配列に文字を読み込む場合

characterで宣言した変数にn文字のテキストを読み込ませたい場合、 n文字のasciiコードの長さはn+4, n文字の全角日本語は2n+4

例えば、youbi(7)に月や火の1文字を入れたい場合、2*1+4=6なので、

character youbi(7)*6

ということになるのだが、これだと、文字の後ろに半角スペースが入ってしまうので、 実行環境に応じて、試行錯誤でスペースの入らない長さを決めるしかないか... フォーマット文でa6とかでテキストを書かせる場合も同様。漢字1文字は、今の環境のgfortranでは、a3でうまくいっている。

乱数の使用例

n組の夫婦数をまず入力し、それぞれの夫婦が男児が生まれるまで 子供を生み続けて、男児が生まれた時点で子供を作るのをやめたら、 男女比はどうなるか(この程度の文化を持つ国はいっぱいあるだろうけど)。

       implicit real*8 (a-h,o-z)
       call srand(time())
       print*,'夫婦組数を入力'
       read*,n
       nonna=0
       notoko=0
       do i=1,n
       ionna=0
       do
       a=rand()
       if(a<0.5) then
               nonna=nonna+1
               ionna=ionna+1
       else
               print*,i,ionna+1
               notoko=notoko+1
               exit
       end if
       end do
       end do
        print*,'女の人数',nonna
        print*,'男の人数',notoko
       end

つまり、赤ちゃんの&link(男女比がある程度 違う国,http://d.hatena.ne.jp/uneyama/20050615#p6)では、何がなされているのかということを 想像すると、なかなか怖い。

do文のカウンタからファイル名を自動生成する

http://rakasaka.fc2web.com/fortran/fortran.html#trim

変数をファイル名にしたい

character(10) a
       i=100
       write(a,*) i
       open(7,file=a)
       write(7,*) 'kakikukeko'
       close(7)
       end

エラーメッセージを表示させる

g77 -Wall -o hoge hoge.f でコンパイル

グラフィックなど

32bit/64bit

32bitパソコンまたは64bitパソコンで以下を計算してみて、 どこまでの整数が扱えるかを確認。

do i=1,70
print*,i,2**i,2.**i
end do
end

32bitでも64bitでも2**31未満しか扱えない。

Linux上で使えるBASICなど

今は昔ながらのBASICはほとんど使われていないが、 高校の数学の教科書では、 未だに昔ながらのBASIC(しかも行番号あり)が使われ続け、 大学入試問題などでも出題されている。 昔のBASICのように覚えることが少なくてすぐに使える教育向け言語ということなら、 Fortran90とかでもいいような気がするのだが...

そうなってくると、高校の数学の問題の検証環境として、 昔ながらのBASICが走る環境がほしい。 Windowsに関しては、フリーソフトが結構あるようだ。 Linuxに関してもフリーソフトは色々あるようだが、 ものによっては、ライブラリの依存関係とかの問題で インストールが簡単でないかもしれない。 ひとまず、 Chipmunk Basic for Linuxは、 インタープリタ本体だけで動作する(たぶん)ので手軽である。 行番号は書いても書かなくてもよくて(たぶん)、 ./basic hoge.bas みたいに実行できる。 対話型の実行もできる。

g77で動作していたものがgfortranで動作しなくなる例

整合配列

g77では、メインプログラムでa(100,100)などと大きめの配列を切っておいて、 サブルーチン内では、引数として受け渡されたnを使って、 a(n,n)などと小さめの配列を切り直しても問題なかったが、 gfortranでは、サブルーチン内でもメインプログラムと同じ大きさの 配列を切らないとうまく引き渡せなくなってしまった。 ただし、サブルーチン内からサブルーチンを呼び出す場合は、 特に問題は起きないので、 整合配列を使いたい場合は、一端サブルーチン内に入ってからサブルーチンを 呼び出すようにすればよいのかもしれない。

バグの例

空行の読み込み

空行(改行のみ)のデータを読み込もうとして、 character変数を使って、 read*,mozi で空行を読もうとしたら、実際には、空行は飛ばされるので、 数値の入った空行の次のデータ文が読まれていた。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-05-13 (水) 09:18:13