所属: 情報棟 一覧

FORTRAN77 フリーコンパイラー Salford FTN77 Personal Edition と GNU g77 の違いとプログラムの書き換え方

 
 
<1>はじめに
<2>コンパイラのダウンロードページおよび説明ページ
<3>使用制限に関して
<4>文字に関して
<5>サブルーチンの名前に関して
<6>文字列のファイル出力に関して
<7>まとめ
 
 
<1>

▼はじめに
 
プログラム言語 FORTRAN77 のネットで得られる無料のコンパイラーとして
「Salford FTN77 Personal Edition」と「g77」がある。
 
本文章では、これらの違いと、「Salford FTN77 Personal Edition」対応プログラム
を「g77」対応プログラムへ書き換える方法について説明したい。
 
 
<2>

▼コンパイラのダウンロードページおよび説明ページ
 
こちら[↓]にまとめてある。
../../academic/prgrm/link/fortran77.html
 
 
<3>

▼使用制限に関して
 
「Salford FTN77 Personal Edition」には以下の制限がある。
 
http://www.salfordsoftware.co.uk/compilers/support/downloads.html 
 
>This compiler is only licensed for personal, non-commercial usage
 
以前は、もっと具体的な記述が見うけられたが、今は見つからない。
 
一方、「g77」は GNU なので、基本的に何をコンパイルしてもかまわないのだろう。
 
筆者は、「Salford FTN77 Personal Edition」の使用制限に関する具体的な記述が
あったときに、後々問題にならないように、在来の「Salford FTN77 Personal Edition」
対応プログラムを「g77」でもコンパイルできるようにする方法を模索した。
 
 
<4>

▼文字に関して
 
まず、日本語一般に関してだが、「Salford FTN77 Personal Edition」「g77」ともに
問題なく使える。
 
ただし「g77」のエディタとして有名な「Force」(g77を含んでおり、これをインストール
しただけで、g77も使用できる)では画面に日本語を表示できない。しかし、「g77」
そのものは日本語を使用できる。
 
つまり、「Force」とは違うエディタで日本語を含むプログラムを書き、これを「Force」
で見ると、日本語は文字化けして表示されるが、コンパイルして実行すると、
MS-DOSプロンプトやファイル入出力に関し、日本語は正しく処理される。
 
しかし、「g77」で、気をつけなければならないのが'\'(円マーク)である。これは'\'の、
escape sequence と言われる役目によるものだ。これは「Salford FTN77 Personal Edition」
では気にしなくても良い。
 
http://ftp.esrf.fr/pub/scisoft/GrWinlib-old/qanda.html#kanji 
 
>Q.特定の漢字を使うとコンパイル時に警告メッセージが現れ,期待通りの結果が
>得られません.
 
>A.GNU-Win32のコンパイラはシフトJISコードの2バイト文字に対応していないため,
>この症状が現れます.
 
>文字 (列) 定数に「漢字」や「かな」を使うことは可能ですが,2バイト目に
>エスケープ文字を表す「円記号」 '\' (5C) が含まれる特定の2バイト文字をそのまま
>使うと, 警告メッセージが現れ,当然,期待通りの結果は得られません.しかし,
>この問題は (^) で示された漢字を,1バイト目は16進表記し,2バイト目は「円記号」
>を表すエスケープ文字 '\\' を使って表すことで回避できます. 例えば,Fortran で
 
>    xxxxxx.f:yy:
>             WRITE(*,*) '...の能率 = ', x
                               ^
>    Unknown escape sequence `\' followed by char code 0xffffff97 at (^)
>という警告が出たら,'能' のシフトJISコードは '945C' (16進) なので,対応する行を
>             WRITE(*,*) '...の\x94\\率 = ', x
>と書き換えることで期待通りの結果が得られます.C の場合も同様です.
>以下に,そのような不具合が生じる文字 (JIS コードの2バイト目が '5C' ) の,
> 1バイト目の16進コード表を示します (表中の '\' は対応するコードの文字が存在
>しないことを表していて,「中点」 '・' => '\x81\x45' はそのまま使うことができます):
 
>      :  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
>    -------------------------------------------------------------------
>    80:      ―  ・  ソ  Ы  ・  ・  \  ・  噂  浬  欺  圭  構  蚕  十
>    90:  申  曾  箪  貼  能  表  暴  予  禄  兔  喀  媾  彌  拿  杤  歃
>    E0:  濬  畚  秉  綵  臀  藹  觸  軆  鐔  饅  鷭  ・  ・  x  x  ・
>    F0:  \  \  \  \  \  \  \  \  \  \  \  \  ・
 
>表の行と列の数字を足したもの (16進数) が対応する文字の1バイト目のコードです.
>上の例の場合,表から '能' に対応する行と列の数字が 90 と 4 なので '能' の
>1バイト目のコードは 94 (16進数) => '\x94' であり, '能' => '\x94\\' とすれば
>よいことがわかります.
 
http://ta.twi.tudelft.nl/archive/sepran-list/9702/msg00002.html 
 
>Gcc does not understand the construction: '\'
>as the backslash is an escape sequence. I replaced it with:
>'\\'
 
http://www.fisica.uson.mx/carlos/Linux/Docs/lnag/Linux_learning.htm 
 
>In regexpr, the special characters are:  "\" (backslash), "." (dot),
>"*" (asterisk), "[" (bracket), "^" (caret, special only at the beginnig of
> a string), "$" (dollar sign, special only at the end of a string).
>A character terminating a pattern string is also special for this string.
 
>The backslash, "\" is used as an "escape" character, i.e., to quote a subsequent
> special character.
>Thus, "" searches for a backslash, "\." searches for a dot, "\*" searches for
> the asterisk, "\[" searches for the bracket, "\^" searches for the caret even
> at the begining of the string, "\$" searches for the dollar sign even at the
> end of the string.
 
なお、"["は special character であるが、"]"は、special character ではない。
 
つまり、
 
  「Salford FTN77 Personal Edition」対応プログラムから
  「g77」対応プログラムへの書き換え方 (1)
 
  '\'を全て'\\'に置換する。ただし、一行の制限をオーバーしないか注意。
 
  ファイルの指定で、ディレクトリを意味する'\'を使っている場合には、無用の混乱を
  さけるため'/'にしておく。
 
  その他'.'などは置換しなくてもかまわない。
 
 
<5>

▼サブルーチンの名前に関して
 
「g77」でコンパイルすると「Same name used for global」というエラーメッセージ
が出る場合がある。
 
http://www.netlaputa.ne.jp/~utty/linuxmld/g771.html 
 
>Q]
>g77 で compile しようとしたら、
>Same name `rand' used for global at (2) and intrinsic at (1) [info -f g77 M INTGLOB]
>というようなメッセージがでるのですが
 
>[A]
>恐らく g77 に組み込まれている関数名と同じ名前を使っているからでしょう。
>上記の場合、rand という 0 から 1 までの範囲で一様乱数を生成する関数が g77 に
>ありますので、メインプログラムで
>EXTERNAL rand
>と外部定義の関数であることを宣言するか、別の名前に変更するとうまくいくと思います。
 
>[Appendix]
>上記のメッセージが出た場合でも、コンパイル自体はうまくいっています。
>ただし、出来上がったバイナリを実行した結果は g77 の組み込み関数をつかった
>結果になりますので十分注意してください。
 
つまり、
 
  「Salford FTN77 Personal Edition」対応プログラムから
  「g77」対応プログラムへの書き換え方 (2)
 
  「g77」でコンパイルして「Same name used for global」というエラーメッセージが
  でるようなら、そのサブルーチンの名前を変える。
 
 
<6>

▼文字列のファイル出力に関して
 
文字列をファイルへ出力した場合の書式は、コンパイラだけでなく、その他の環境に
よっても違うようだ。
 
以下の三つの環境について、いろいろなWRITE文で出力させて、書式を比較する。
 
 1)「Salford FTN77 Personal Edition」, Win XP
 2)「g77」, Win XP
 3)「g77」, Win 98
 
UNIT 22 にファイルを指定する。文字型 cha は、
 
      character*250 cha
      cha='あいうえお'  である。
 
サブルーチン ALG250(文字型,整数型) は、文字型引数の実際の長さを整数型引数に代入する
もので、
 
      call ALG250(cha,wlg)
 
で、wlgは 10 となる。cha は、'あいうえお'なので、最後バイトである'お'の2バイト目は
10バイト目であり、この 10 が wlg に代入されるのだ。LEN関数とは異なるものであること
に注意してほしい (LEN(cha)=250である)。
 
1]
プログラム
 
      call ALG250(cha,wlg)
      write(22,602) (cha(w:w),w=1,wlg)
 602  format(250A1)
 
出力結果
 
 1)あいうえお[改行]
 
 2)あいうえお[改行]
 
 3)あいうえお[改行]
 
2]
プログラム
 
      call ALG250(cha,wlg)
      write(22,601) cha(1:wlg)
 601  format (A250)
 
出力結果
 
 1)[半角スペース240個]あいうえお[改行]
 
 2)[半角スペース240個]あいうえお[改行]
 
 3)[半角スペース240個]あいうえお[改行]
 
つまり、'お'の2バイト目が250バイト目となる。
 
3]
プログラム
 
      write(22,601) cha
 601  format (A250)
 
出力結果
 
 1)あいうえお[改行]
 
  2)[半角スペース240個]あいうえお[改行]
 
 3)[半角スペース240個]あいうえお[改行]
 
4]
プログラム
 
      write(22,*) cha
 
出力結果
 
 1)[半角スペース]あいうえお[改行]
  [半角スペース][改行]
  [半角スペース][改行]
 
 2)[半角スペース]あいうえお[半角スペース239個][改行]
 
 3)[半角スペース]あいうえお[半角スペース239個][改行]
 
5]
プログラム
 
      call ALG250(cha,wlg)
      write(22,*) cha(1:wlg)
 
出力結果
 
 1)[半角スペース]あいうえお[改行]
 
 2)[半角スペース]あいうえお[半角スペース239個][改行]
 
 3)[半角スペース]あいうえお[改行]
 
たいていは、「あいうえお[改行]」という出力が期待されていると思うので、
 
  「Salford FTN77 Personal Edition」対応プログラムから
  「g77」対応プログラムへの書き換え方 (3)
 
  文字列をファイルへ出力する場合には、
 
      call ALG250(cha,wlg)
        write(22,602) (cha(w:w),w=1,wlg)
   602  format(250A1)
 
  といったプログラムにする。これは 1] に当たる。
 
 
<7>

▼まとめ
 
まとめると、「Salford FTN77 Personal Edition」対応プログラムを「g77」対応プログラム
へ書き換える方法は、
 
(1)
  '\'を全て'\\'に置換する。ただし、一行の制限をオーバーしないか注意。
 
  ファイルの指定で、ディレクトリを意味する'\'を使っている場合には、無用の混乱を
  さけるため'/'にしておく。
 
  その他'.'などは置換しなくてもかまわない。
 
(2)
  「g77」でコンパイルして「Same name used for global」というエラーメッセージが
  でるようなら、そのサブルーチンの名前を変える。
 
(3)
  文字列をファイルへ出力する場合には、
 
      call ALG250(cha,wlg)
        write(22,602) (cha(w:w),w=1,wlg)
   602  format(250A1)
 
  といったプログラムにする。
 
である。これで、「g77」でも、正常にコンパイルされ、ほぼ正常に動くプログラムになるはずだ。
 
あと、注意すべきことを挙げると、
 
http://ftp.esrf.fr/pub/scisoft/GrWinlib-old/qanda.html#kanji 
 
>      :  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
>    -------------------------------------------------------------------
>    80:      ―  ・  ソ  Ы  ・  ・  \  ・  噂  浬  欺  圭  構  蚕  十
>    90:  申  曾  箪  貼  能  表  暴  予  禄  兔  喀  媾  彌  拿  杤  歃
>    E0:  濬  畚  秉  綵  臀  藹  觸  軆  鐔  饅  鷭  ・  ・  x  x  ・
>    F0:  \  \  \  \  \  \  \  \  \  \  \  \  ・
 
の表に含まれている文字がファイル名(ファイルの中身は問題ない)にならないようにすること
がある。
 
 
初出 2004/ 3/20 
 
■  ■  ■

 

 簡易html化ドキュメント


Copyright(C) TAKAGI-1 All rights reserved.