Fortran Builder FAQ – よくある質問とその答え


  • Fortran Builder は Windows のどのバージョンに対応していますか? [答え]
  • USB キーを破損してしまいました.新しい USB キーを貰えますか? [答え]
  • フローティングライセンスなど,USB キー以外のライセンス形態での利用は可能ですか? [答え]
  • プロジェクトとは何ですか? [答え]
  • プロジェクトは必ず作らなければいけないのですか? [答え]
  • 既存のソースファイルを編集エリアに開いたら,文字化けして内容が表示されません. [答え]
  • 「multiple definition of `main'」というリンクエラーが出てビルドに通りません. [答え]
  • 「実行」ボタンが灰色のままでボタンが押せません. [答え]
  • 「コンパイル」,「ビルド」,「リビルド」の違いを教えてください. [答え]
  • 「実行」と「デバッグ実行」の違いを教えてください. [答え]
  • デバッグ実行時の「ステップ実行」と「トレース実行」の違いを教えてください. [答え]
  • 実行時の引数を設定できますか? [答え]
  • プログラムを実行するとコマンドプロンプトが一瞬で消えてしまいます. [答え]
  • テキストの矩形選択はできますか? [答え]
  • プログラムの実行時診断(実行時エラーの検出)機能を使うにはどうすれば良いですか? [答え]
  • メモリリークがあるかどうかを調べるにはどうすれば良いですか? [答え]
  • プログラムの最適化(-On )を行うにはどうすれば良いですか? [答え]
  • 固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f90)に変換できますか? [答え]
  • ソースコードの整形機能はありますか? [答え]
  • コールグラフとは何ですか? [答え]
  • コマンドラインからコンパイラを単体で使用することはできますか? [答え]
  • 線形方程式や固有値問題を解くための数値計算ライブラリはバンドルされていますか? [答え]
  • C から Fortran の手続(サブルーチン,関数)を呼べますか? [答え]
  • C と Fortran の混合プログラミング時の __NAGf90_rts_init と __NAGf90_io_finish という関数は何ですか? [答え]
  • Fortran 77 のプログラムをコンパイルするには,何らかのコンパイラオプションが必要ですか? [答え]
  • 古い Fortran プログラム(レガシーコード)がコンパイルに通りません. [答え]
  • 固定形式と自由形式のソースファイルが混在しているプロジェクトなのですが,コンパイルは大丈夫でしょうか? [答え]
  • CDABS(A),DCMPLX(X,Y),DCONJG(Z),DIMAG(Z),DREAL(Z) はどうすれば利用できますか? [答え]
  • 関数 getarg はありますか? [答え]
  • 関数 getenv はありますか? [答え]
  • 関数 flush はありますか? [答え]
  • 関数 system はありますか? [答え]
  • 手続(サブルーチン,関数)fdate がコンパイルに通りません. [答え]
  • サブルーチン idate がコンパイルに通りません. [答え]
  • 関数 dtime や etime がコンパイルに通りません. [答え]
  • 「TAB 書式入力です」という警告メッセージが出ます. [答え]
  • 「数値データ型にバイト数が指定されました」という警告メッセージが出ます. [答え]
  • 「KIND 値 (*) が有効な表現方法ではありません」というエラーが出てコンパイルに通りません. [答え]
  • 「入力バッファにおいてレコードが長すぎます」または「出力においてバッファオーバーフローが発生しました」というエラーはどういう意味ですか? [答え]
  • コマンドプロンプトからプログラムを実行すると「Press ENTER to continue--」が表示されずに(一時停止せずに)終了します. [答え]
  • 「変数 ** のサイズ (*********** バイト) が大きすぎます」というエラーが出てコンパイルに通りません. [答え]
  • 「C:¥...¥*.exe は有効な Win32 アプリケーションではありません.」というエラーが出てプログラムが実行できません. [答え]
  • デバッグ実行時に「ステップ実行」や「トレース実行」を行っているのにプログラムが最後まで走ってしまい1ステップで停止しません. [答え]
  • OpenGL のテンプレートプログラムを実行したのですが,ウィンドウを「閉じる」ボタンで閉じてもプログラムが終了しません. [答え]
  • 実行ファイル(*.exe)を他の PC で実行しようとすると,lib64f71rts.dll または libf71rts.dll が見つからない旨のエラーが出て実行できません. [答え]
  • 「警告:浮動小数アンダーフローが発生しました」という警告メッセージが実行時に出ます.アンダーフローの発生箇所を調べる方法はありますか? [答え]
  • 「警告:浮動小数アンダーフローが発生しました」という警告メッセージが実行時に出ます.この警告メッセージの出力を抑止することはできますか? [答え]
  • 4倍精度をサポートしていますか? [答え]
  • 編集記述子 $(改行抑止)はサポートしていないのですか? [答え]
  • Fortran Builder で作成したアプリケーションの再配布は可能ですか? [答え]
  • Fortran の組込み関数(例えば,CDEXP)がコンパイルに通りません. [答え]
  • 「外部例外 EEFFACE」->「メモリが足りません」というエラーが出てビルドに通りません. [答え]
  • RANDOM_SEED で初期化した(シードを設定した)後に RANDOM_NUMBER で乱数を生成したのですが,出力結果が明らかにランダムではありません.RANDOM_SEED の使い方を教えてください. [答え]
  • 「crt0_c.c(18): `WinMain' が参照できません.」または「main.c(0): undefined reference to `WinMain@16'」というリンクエラーが出てビルドに通りません. [答え]
  • 「実行時エラー: *** 算術例外: 浮動小数ゼロ除算 - 終了します」というエラーが出て実行が途中で止まります. [答え]
  • 「変数 ** はSAVE属性を指定するには大きすぎます(*********** バイト)」というエラーが出てコンパイルに通りません. [答え]
  • 「... R_X86_64_PC32 against symbol ...」というリンクエラーが出てビルドに通りません. [答え]
  • 「このアプリはお使いの PC では実行できません」というメッセージが出てプログラムが実行できません. [答え]
  • NAMELIST を入力するときに,自動的に他のリストをスキップすることはできますか? [答え]
  • 64-bit OS 環境で 32-bit 実行ファイルを生成することはできますか? [答え]
  • Fortran Builder をデフォルト(出荷時の状態)に戻すことはできますか? [答え]


Fortran Builder は Windows のどのバージョンに対応していますか?
◇ Windows 11
◇ Windows 10

以上のバージョンに対応しています.

補足:
32-bit OS 環境では 32-bit 実行ファイルを生成します.
64-bit OS 環境では 64-bit 実行ファイルを生成します.
(また,64-bit OS 環境で 32-bit 実行ファイルを生成することもできます.)


USB キーを破損してしまいました.新しい USB キーを貰えますか?

年間保守サービスにご加入いただいている場合は無償でご対応いたします.
(年間保守サービスにご加入いただいていない場合は製品の再購入となります.)

破損した USB キーを弊社(日本 NAG)にお送りいただいた後,新しい USB キーをお客様にお送り致します.
破損した USB キーをご自身で廃棄されませんようお願い致します.

ご希望の際は,弊社(日本 NAG)までお気軽にお問い合わせください.

注意:
USB キーの紛失には対応しておりません.
USB キーを紛失された場合は製品の再購入となりますのでご注意ください.


フローティングライセンスなど,USB キー以外のライセンス形態での利用は可能ですか?

はい,以下のライセンス形態でのご利用も可能です.

◇ フローティングライセンス
◇ サイトライセンス
◇ ノードロックライセンス

上記のライセンス形態をご希望のお客様は,弊社(日本 NAG)までお気軽にお問い合わせください.

注意:
ノードロックライセンスは1ライセンスにつき特定の1台のマシンに対してのみ有効なテキストファイル形式のライセンスです.
ノードロックライセンスキーを発行した後にマシンの変更は行えませんので予めご了承ください.
ご利用のマシンに USB ポートが無いなどの特別な理由がない限りは,USB キーでのご利用をお勧めします.


プロジェクトとは何ですか?

Fortran Builder ではユーザープログラムをプロジェクトという単位で管理します.
プロジェクトには実行ファイルを作成するために必要な一連のファイル(ソースファイルやメイクファイル,またコンパイル後に作成されるオブジェクトファイルやモジュールファイルなど)が含まれます.

プロジェクトを作成することはワークフォルダーを作成することに似ています.
プロジェクトを作成した後に,実行ファイルを作成するために必要なソースファイルをその中に追加して,プログラムをビルド(コンパイル・リンク)するイメージです.

補足:
Fortran Builder の基本的な使用手順は以下のようになります.

1. 新規にプロジェクトを作成する(または,既存のプロジェクトを開く).
2. 新規の(または,既存の)ソースファイルをプロジェクトに追加する.
3. ソースファイルを編集する(ソースコードを書く).
4. ソースファイルをビルド(コンパイル・リンク)する.
※ ビルドに通らなかった場合は 3 に戻る.
5. 実行ファイルを実行する.

注意:
1つの実行ファイルに対して1つのプロジェクトが対応します.
従って,1つのプロジェクトに対して主プログラムが複数存在してはいけません.


プロジェクトは必ず作らなければいけないのですか?

プログラムが単一のソースファイルの場合は,プロジェクトを作成することなくソースファイルを新規作成する(または,既存のソースファイルを開く)ことで,そのままビルド・実行を行う事が可能です.
Fortran Builder では,この機能を「クイック実行」と呼んでいます.

Fortran Builder はプロジェクトを開いていない状態では常にこのクイック実行モードとなっています.
(これに対して,プロジェクトを開いている状態をプロジェクト実行モードと呼びます.)

クイック実行は単一のソースファイルに対しての機能となりますので,複数のソースファイルが開かれている場合は,編集エリアでアクティブになっているソースファイルがビルド・実行の対象となります.

実行ファイル(その他,メイクファイルやオブジェクトファイルなど実行ファイルを作成するために必要な一連のファイル)は,対象ソースファイルが置かれているフォルダーに作成されます.

これに対して,複数のソースファイルをビルド・実行する場合は,プロジェクトを作成する必要があります.

クイック実行については,Fortran Builder ヘルプ「プロジェクトなしで実行する(クイック実行)」も併せてご参照ください.


既存のソースファイルを編集エリアに開いたら,文字化けして内容が表示されません.

ソースファイルの文字コードが Shift-JIS でない可能性があります.

Fortran Builder は Shift-JIS のファイルのみをサポートします.

(適当なテキストエディタなどを用いて,)文字コードを Shift-JIS に変更してご利用ください.


「multiple definition of `main'」というリンクエラーが出てビルドに通りません.

これは1つのプロジェクトに対して複数の主プログラムが存在しているために出ているリンクエラーです.

1つの実行ファイルに対して1つのプロジェクトが対応します.
従って,1つのプロジェクトに対して主プログラムが複数存在してはいけません.


「実行」ボタンが灰色のままでボタンが押せません.

プログラムが実行中になっていませんか?
プログラムの編集・ビルド・実行は, 実行中のプログラムを終了させてから行ってください.


「コンパイル」,「ビルド」,「リビルド」 の違いを教えてください.

「コンパイル」は編集エリアでアクティブになっている単一のソースファイルを対象にコンパイルを行います.

「ビルド」はコンパイルとリンクを行います.
特に変更があったソースファイルのみをコンパイルの対象とします.

※ オブジェクトファイルの無いまっさらな状態では,すべてのソースファイルに対してコンパイル・リンクを行います.
※ すべてのソースファイルがコンパイル済みであり(つまり全てのオブジェクトファイルがある)かつソースファイルに変更がない場合は,リンクのみを行います.
※ すべてのソースファイルがコンパイル・リンク済みであり(つまり全てのオブジェクトファイルと実行ファイルがある)かつソースファイルに変更がない場合は,何も行いません.

「リビルド」はクリーンとビルドを行います.
クリーンはオブジェクトファイルと実行ファイルを削除し,ビルド環境をソースファイルのみの状態に戻します.
従って,すべてのソースファイルがコンパイルし直されます.

補足:
ソースコードを機械語に翻訳して実行ファイルを作成するためには,以下の2つの独立したステップが必要になります.

1. コンパイル
ソースコード(*.f90 など)を機械語に変換し,オブジェクトファイル(*.o)を生成します.
2. リンク
複数のオブジェクトファイル(*.o)(および,外部ライブラリなど)を結合し,実行ファイル(*.exe)を生成します.


「実行」と「デバッグ実行」の違いを教えてください.

プログラムを「デバッグ実行」すると,裏でデバッガーが起動し,ブレークポイントを設定した箇所でプログラムの実行が一時停止します.
そして,その時点での変数の値の確認/変更やその後のステップ/トレース実行が行えるようになります.
また,ブレークポイントでプログラムが一時停止した状態から再度「デバッグ実行」を行うと,次のブレークポイントまで実行が行われ一時停止します.

それに対して「実行」は,ブレークポイントを設定した箇所でプログラムの実行を中断することなく,プログラムを通常通り実行するものです.

補足:
ブレークポイントとはプログラムの実行を一時停止する場所を示すものです.
ブレークポイントの設定と解除は,行の左端をクリックしてください.


デバッグ実行時の「ステップ実行」と「トレース実行」の違いを教えてください.

「ステップ実行」と「トレース実行」は,デバッグ実行時にプログラムが一時停止した状態からプログラムを1行ずつ実行します.
両者が異なるのは実行箇所が手続(サブルーチン,関数)を呼び出している時です.
「ステップ実行」は手続を処理した後に次の行で一時停止します.
「トレース実行」は手続の中の1行目で一時停止します.


実行時の引数を設定できますか?

はい,可能です.
実行時の引数は Fortran Builder メニューバー「実行 > 実行時の引数」から設定することができます.

設定例(標準入出力のリダイレクション):

< input.txt > output.txt

プログラムを実行するとコマンドプロンプトが一瞬で消えてしまいます.

標準入力のリダイレクションに,存在していないファイルが指定されていませんか?
この場合,指定されたファイルが見付からないためにプログラムの実行自体が行われません.
Fortran Builder メニューバー「実行 > 実行時の引数」の設定をご確認ください.


テキストの矩形選択はできますか?

はい,可能です.
Alt キーを押しながら編集エリアをドラッグしてください.


プログラムの実行時診断(実行時エラーの検出)機能を使うにはどうすれば良いですか?

プログラムの実行時診断(実行時エラーの検出)機能を有効にするには,Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 実行時診断 > 実行時診断オプション (-C=)

を設定してください.

「標準」はコンパイラオプション -C に相当し,「別名による仮変数の変更 (=alias)」,「ダングリングポインタ (=dangling)」,「整数オーバーフロー (=intovf)」,「未定義の変数 (=undefined)」を除く全てのチェック項目が有効になります.

「全部」はコンパイラオプション -C=all に相当し,「未定義の変数 (=undefined)」を除く全てのチェック項目が有効になります.

「オプション選択」はコンパイラオプション -C=check に相当し,チェック項目(check )を選択できます.

※ オプションの詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください.

Fortran Builder は検出された実行時エラーのメッセージをメッセージウィンドウに出力します.

補足:
Fortran 標準に従って検出される通常の実行時エラーは,上記オプションの指定に関係なく検出されます.


メモリリークがあるかどうかを調べるにはどうすれば良いですか?

プログラムのメモリトレース(メモリリークの検出)機能を有効にするには,Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 実行時診断 > メモリトレースオプション (-mtrace=)

を設定してください.

「全部」はコンパイラオプション -mtrace=all に相当し,全ての詳細設定が有効になります.

「オプション選択」はコンパイラオプション -C=trace_opt_list に相当し,詳細設定(trace_opt_list )を選択できます.

※ オプションの詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください.

「ファイル出力と IDE 表示」にチェックを入れますと,メモリトレースの結果がテキストファイル fbrmtrace.log に書き出され,編集エリアに表示されます.
(チェックを入れない場合は,標準出力へ出力されます.)

メモリ診断の出力例:

 3 allocations
 No memory leaked

[Allocated item 1 (size 1025) = Z'2BB0010']
[Allocated item 2 (size 1025) = Z'2BB0430']
[Allocated item 3 (size 1025) = Z'2BB0850']
[Deallocated item 2 (size 1025, at Z'2BB0430')]
[Deallocated item 3 (size 1025, at Z'2BB0850')]
[Deallocated item 1 (size 1025, at Z'2BB0010')]

注意:
このオプションは「自動的ガーベージコレクションを有効にする (-gc)」オプションと互換性がありません.
両方のオプションにチェックが入っているとコンパイルエラーになります.


プログラムの最適化(-On )を行うにはどうすれば良いですか?

プログラムの最適化は Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

基本設定 > 最適化設定

を指定してください.

これはコンパイラオプション -Onn は最適化レベル 0 〜 4)に相当します.

Fortran Builder(NAG Fortran コンパイラ)はデフォルトでは「最適化なし」(-O0 に相当)が設定されています.

※ オプションの詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください.


固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f90)に変換できますか?

はい,可能です.

Fortran Builder メニューバー「ツール > ソース整形の実行」をご利用ください.
Fortran Builder メニューバー「ツール > ソース整形の設定」で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます.

ソース整形は編集エリアでアクティブになっているソースファイルが対象となります.
特に,対象となるソースファイルが固定形式(例えば,abc.f)の場合は,整形結果として自由形式のソースファイル(例えば,abc.f90)が別途作成されます.
(元の固定形式のソースファイル(例えば,abc.f)はそのまま残ります.)

注意:
ソース整形は元のプログラムが Fortran Builder(NAG Fortran コンパイラ)でコンパイルに通るプログラムであること(つまり正しい Fortran のプログラムであること)が前提となります.


ソースコードの整形機能はありますか?

はい,ございます.

Fortran Builder メニューバー「ツール > ソース整形の実行」をご利用ください.
Fortran Builder メニューバー「ツール > ソース整形の設定」で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます.

ソース整形は編集エリアでアクティブになっているソースファイルが対象となります.
特に,対象となるソースファイルが固定形式(例えば,abc.f)の場合は,整形結果として自由形式のソースファイル(例えば,abc.f90)が別途作成されます.
(元の固定形式のソースファイル(例えば,abc.f)はそのまま残ります.)

注意:
ソース整形は元のプログラムが Fortran Builder(NAG Fortran コンパイラ)でコンパイルに通るプログラムであること(つまり正しい Fortran のプログラムであること)が前提となります.


コールグラフとは何ですか?

コールグラフとは,コンピュータープログラムの手続間の呼び出し関係を表現した有向グラフです.

Fortran Builder には「コールグラフの表示」機能が搭載されており,Fortran プログラム(主プログラム,外部副プログラム,モジュール)の手続(サブルーチン,関数)間の呼び出し関係をテキストファイル callgraph.txt に出力します.

この機能は Fortran Builder メニューバー「ツール > コールグラフの表示」からご利用いただけます.

コールグラフの出力例:

コールグラフ 2011年12月02日 15:31

    1: MAIN
    2:     SUB


コールグラフの索引

   行    手続
    1    MAIN
    2    SUB


呼び出しテーブル

  手続       呼び出し元
  SUB        MAIN

コマンドラインからコンパイラを単体で使用することはできますか?

はい,コマンドラインからコンパイラ(NAG Fortran コンパイラ)を単体で使用することも可能です.

Windows スタートメニュー「NAG Fortran Builder 7.2 > NAG Fortran 7.2 コマンドプロンプト」から,コンパイラにパスが通った状態でコマンドプロンプトを起動することができます.

また,Fortran Builder メニューバー「表示 > コマンドプロンプト」から,コンパイラにパスが通った状態で(かつ,プロジェクトフォルダーをカレントフォルダーとした状態で)コマンドプロンプトを起動することができます.

◇ コンパイラの格納位置

[Fortran Builder インストールフォルダー]¥nagfor¥bin¥nagfor.exe

32-bit Windows 環境のデフォルトは,
C:¥Program Files¥NAG¥FBuilder 7.2¥nagfor¥bin¥nagfor.exe

64-bit Windows 環境のデフォルトは,
C:¥Program Files (x86)¥NAG¥FBuilder 7.2¥nagfor¥bin¥nagfor.exe

◇ 使用方法(コマンド)

nagfor [オプション] ... ファイル ...

※ 詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2 コンパイラの使用」をご参照ください.

◇ 簡単な使用例

1. プログラム(myprog.f90)を作成する.

program main
  print *, 'Hello World'
end program

2. プログラム(myprog.f90)をコンパイル・リンクする.

nagfor -o hello.exe myprog.f90

※ オプションの詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください.

3. 作成された実行ファイル(hello.exe)を実行する.

hello.exe

線形方程式や固有値問題を解くための数値計算ライブラリはバンドルされていますか?

はい,線形方程式や固有値問題を解くための標準的な数値計算ライブラリ LAPACK (Linear Algebra PACKage) がバンドルされています.

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

基本設定 > 追加ライブラリ > LAPACK を利用する

を指定してください.LAPACK ルーチンを利用できるようになります.
(リンク時に,LAPACK のスタティックライブラリがリンクされます.)


C から Fortran の手続(サブルーチン,関数)を呼べますか?

はい,Fortran 2003 から導入された機能「C との相互利用可能性(Interoperability with C)」を用いて,C の関数から Fortran の手続を呼び出したり,Fortran の手続から C の関数を呼び出したりすることができます.


C と Fortran の混合プログラミング時の __NAGf90_rts_init と __NAGf90_io_finish という関数は何ですか?

メインプログラムが C/C++ の場合には,__NAGf90_rts_init を C/C++ から呼び出す必要があります.
この関数は Fortran の浮動小数点環境の初期化を行うと共に,Fortran の UNIX モジュールがコマンドライン引数にアクセスすることを可能にします.
また,最後には後処理関数 __NAGf90_io_finish を呼び出し,バッファをフラッシュしてから処理を終了する必要があります.

一般的に C から Fortran を呼び出す際の C プログラム側の記述は以下の通りです.

int main(int argc, char *argv[])
{
  __NAGf90_rts_init(argc, argv); 

  /* ここに Fortran 呼び出し処理を記述する */

  __NAGf90_io_finish();

  return 0;
}

Fortran 77 のプログラムをコンパイルするには,何らかのコンパイラオプションが必要ですか?

いいえ,特にコンパイラオプションを指定する必要はありません.

Fortran Builder(NAG Fortran コンパイラ)は Fortran 標準(Fortran 77 の規格を含む)に従ってコンパイルを行います.
ただし,ファイルの拡張子によってコーディング形式(固定形式と自由形式)の区別は行います.
拡張子が *.f, *.for, *.ftn のファイルに対しては固定形式で書かれたプログラムとしてコンパイルを行い,拡張子が *.f90, *.f95 のファイルに対しては自由形式で書かれたプログラムとしてコンパイルを行います.


古い Fortran プログラム(レガシーコード)がコンパイルに通りません.

Fortran Builder(NAG Fortran コンパイラ)はプログラムが Fortran 標準に準拠しているかどうかを厳しくチェックします.
新たなプログラムを作成する場合,これはコンパイラの本来あるべき姿とも言えますが,昔書かれたプログラム(レガシーコード)をコンパイルする際に厳しいチェックを望まない場合もあります.
このため,Fortran Builder(NAG Fortran コンパイラ)では,厳しいチェックを行わないことを指示するためのコンパイラオプションが用意されています.

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 基本設定 > 古典的ソースコードのエラーを警告にする (-dusty)

を指定してください.
これにより,レガシーコードに良く見られるエラーを警告として扱うようになり,コンパイルが続行できます.

さらに必要であれば,

Fortran コンパイラ > 詳細設定 (1) > 警告表示選択 > 全て非表示

を指定して警告の出力を抑止することも可能です.


固定形式と自由形式のソースファイルが混在しているプロジェクトなのですが,コンパイルは大丈夫でしょうか?

はい,大丈夫です.

拡張子が *.f, *.for, *.ftn のファイルに対しては固定形式で書かれたプログラムとしてコンパイルを行い,拡張子が *.f90, *.f95 のファイルに対しては自由形式で書かれたプログラムとしてコンパイルを行います.


CDABS(A),DCMPLX(X,Y),DCONJG(Z),DIMAG(Z),DREAL(Z) はどうすれば利用できますか?

CDABS などの組込み関数は Fortran 標準の組込み関数ではありませんが,多くのコンパイラがこれら Fortran 非標準の組込み関数をサポートしています.

Fortran Builder(NAG Fortran コンパイラ)では,Fortran 標準に準拠するために,Fortran 非標準の倍精度複素数組込み手続については,
Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 基本設定 > 非標準の倍精度複素数組込み関数を有効にする (-dcfuns)

を指定した時にのみ利用可能となっています.


関数 getarg はありますか?

はい,Fortran Builder(NAG Fortran コンパイラ)は多くの POSIX システムコールを独自の組込みモジュールで提供しています.
これらにアクセスするためには,該当するモジュールを use 文により指定する必要があります.
getarg はモジュール f90_unix_env においてサブルーチンとして提供されます.
詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 7.4 f90_unix_env」をご参照ください.

しかしながら,Fortran 標準の観点からは,Fortran 2003 から導入された組込みサブルーチン get_command_argument の利用が推奨されます.
Fortran 標準の組込みサブルーチン get_command_argument を利用したプログラム例を以下に示します.

program main
  implicit none
  integer :: i, length, status
  character(:), allocatable :: arg
  intrinsic :: command_argument_count, get_command_argument
  !
  ! Display all command-line arguments.
  !
  do i = 0, command_argument_count()
    call get_command_argument(i, length = length, status = status)
    if (status == 0) then
      !
      ! Allocate "arg" to the correct length.
      !
      allocate (character(length) :: arg)
      call get_command_argument(i, arg, status = status)
      if (status == 0) then
        !
        ! Retrieved ok, display it.
        !
        if (i == 0) then
          print *, 'Command = "', arg, '"'
        else
          print *, 'Argument', i, '= "', arg, '"'
        end if
      end if
      deallocate (arg)
    end if
    !
    ! If we got some kind of error, display the error message.
    !
    if (status /= 0) print *, 'Error', status, 'on argument', i
  end do
end program

関数 getenv はありますか?

はい,Fortran Builder(NAG Fortran コンパイラ)は多くの POSIX システムコールを独自の組込みモジュールで提供しています.
これらにアクセスするためには,該当するモジュールを use 文により指定する必要があります.
getenv はモジュール f90_unix_env においてサブルーチンとして提供されます.
詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 7.4 f90_unix_env」をご参照ください.

しかしながら,Fortran 標準の観点からは,Fortran 2003 から導入された組込みサブルーチン get_environment_variable の利用が推奨されます.
Fortran 標準の組込みサブルーチン get_environment_variable を利用したプログラム例を以下に示します.

program main
  !
  ! This program displays the values of some environment variables;
  ! if they do not exist, that fact is displayed.
  !
  implicit none
  call show('FRED')
  call show('USER')
  call show('USERNAME')
contains
  subroutine show(name)
    character(*), intent(in) :: name
    character(:), allocatable :: value
    integer len, status
    intrinsic get_environment_variable
    call get_environment_variable(name, status = status, length = len)
    if (status == 1) then
      print *, 'Environment variable "', name, '" does not exist.'
    else if (status /= 0) then
      print *, 'Error', status, 'for environment variable "', name, '"'
    else
      allocate (character(len) :: value)
      call get_environment_variable(name, value = value)
      print *, 'Environment variable "', name, '" has the value "', value, '".'
    end if
  end subroutine
end program

関数 flush はありますか?

はい,Fortran Builder(NAG Fortran コンパイラ)は多くの POSIX システムコールを独自の組込みモジュールで提供しています.
これらにアクセスするためには,該当するモジュールを use 文により指定する必要があります.
flush はモジュール f90_unix_io においてサブルーチンとして提供されます.
詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 7.7 f90_unix_io」をご参照ください.

しかしながら,Fortran 標準の観点からは,Fortran 2003 から導入された flush 文の利用が推奨されます.
flush 文を利用したプログラム例を以下に示します.

program slow_dots
  !
  ! This program prints 10 dots, one per second, then finishes.
  !
  use iso_fortran_env, only : output_unit
  implicit none
  integer i
  do i = 1, 10
    write (*, '(a)', advance = 'no') '.'
    call delay
    flush (output_unit)
  end do
  print *, 'Done.'
contains
  subroutine delay
    integer cps,start,now
    intrinsic system_clock
    call system_clock(count = start, Count_Rate = cps)
    if (start == -huge(start)) stop 'No clock.'
    do
      call system_clock(count = now)
      if (now < start .or. now >= start + cps) exit
    end do
  end subroutine
end program

関数 system はありますか?

はい,Fortran Builder(NAG Fortran コンパイラ)は多くの POSIX システムコールを独自の組込みモジュールで提供しています.
これらにアクセスするためには,該当するモジュールを use 文により指定する必要があります.
system はモジュール f90_unix_proc においてサブルーチンとして提供されます.
詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 7.8 f90_unix_proc」をご参照ください.

しかしながら,Fortran 標準の観点からは,Fortran 2008 から導入された組込みサブルーチン execute_command_line の利用が推奨されます.
Fortran 標準の組込みサブルーチン execute_command_line を利用したプログラム例を以下に示します.

program execute_example
  implicit none
  call execute_command_line('echo hello execute')
end program

手続(サブルーチン,関数)fdate がコンパイルに通りません.

手続(サブルーチン,関数)fdate は Fortran 標準の組込み手続ではありません.

代わりに,Fortran 標準の組込みサブルーチン date_and_time を以下のプログラム例を参考にご利用ください.

サブルーチン fdate の代替例:

subroutine fdate(dstr)
  implicit none
  character(len=*),intent(out) :: dstr
  character(len=3), parameter :: mstr(12) = (/ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', &
                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' /)
  character(len=3), parameter :: dowstr(0:6) = (/ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' /)
  integer, parameter :: t(12) = (/ 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 /)
  integer ival(8), y, m, d, dow
  character(24) buf
  call date_and_time(values=ival)
  m = ival(2)
  y = ival(1)
  d = ival(3)
  ! Sakamoto's method
  if (m<3) y = y - 1
  dow = mod(y+y/4-y/100+y/400+t(m) + d, 7)
  write (buf, '(a3,1x,a3,1x,i2,1x,i2,":",i2.2,":",i2.2,1x,i4)') &
    dowstr(dow), mstr(m), d, ival(5), ival(6), ival(7), ival(1)
  dstr = buf
end subroutine

関数 fdate の代替例:

character(len=24) function fdate()
  implicit none
  character(len=3), parameter :: mstr(12) = (/ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', &
                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' /)
  character(len=3), parameter :: dowstr(0:6) = (/ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' /)
  integer, parameter :: t(12) = (/ 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 /)
  integer ival(8), y, m, d, dow
  call date_and_time(values=ival)
  m = ival(2)
  y = ival(1)
  d = ival(3)
  ! Sakamoto's method
  if (m<3) y = y - 1
  dow = mod(y+y/4-y/100+y/400+t(m) + d, 7)
  write (fdate, '(a3,1x,a3,1x,i2,1x,i2,":",i2.2,":",i2.2,1x,i4)') &
    dowstr(dow), mstr(m), d, ival(5), ival(6), ival(7), ival(1)
end function

サブルーチン idate がコンパイルに通りません.

サブルーチン idate は Fortran 標準の組込みサブルーチンではありません.

代わりに,Fortran 標準の組込みサブルーチン date_and_time を以下のプログラム例を参考にご利用ください.

idate の代替例:

subroutine idate(iarray)
  implicit none
  integer iarray(3), ival(8)
  call date_and_time(values=ival)
  iarray(1) = ival(3)
  iarray(2) = ival(2)
  iarray(3) = ival(1)
end subroutine

関数 dtime や etime がコンパイルに通りません.

関数 dtime や etime は Fortran 標準の組込み関数ではありません.
代わりに,Fortran 標準の組込みサブルーチン cpu_time や system_clock を以下のプログラム例「代替その1」を参考にご利用ください.
なお,「代替その2」はそれぞれ Fortran Builder(NAG Fortran コンパイラ)独自の組込みモジュール f90_unix_env で提供される関数 times を利用したものとなります.

dtime の代替その1:

real function dtime(time)
  real time(2)
  double precision, save :: last_time = 0
  double precision this_time
  call cpu_time(this_time)
  time(1) = this_time - last_time
  time(2) = 0
  dtime = time(1)
  last_time = this_time
end function

dtime の代替その2:

real function dtime(time)
  use f90_unix_env, only : tms, times
  real time(2)
  type(tms), save :: lastbuf
  logical :: start = .true.
  type(tms) buffer
  integer junk
  junk = times(buffer)
  if (start) then
    lastbuf%utime = 0
    lastbuf%stime = 0
    start = .false.
  end if
  time(1) = buffer%utime - lastbuf%utime
  time(2) = buffer%stime - lastbuf%stime
  dtime = time(1) + time(2)
  lastbuf = buffer
end function

etime の代替その1:

real function etime(time)
  real time(2)
  call cpu_time(etime)
  time(1) = etime
  time(2) = 0
end function

etime の代替その2:

real function etime(time)
  use f90_unix_env, only : tms, times
  real time(2)
  type(tms) buffer
  integer junk
  junk = times(buffer)
  time(1) = buffer%utime
  time(2) = buffer%stime
  etime = buffer%utime + buffer%stime
end function

「TAB 書式入力です」という警告メッセージが出ます.

TAB 書式は Fortran 標準では拡張機能に位置づけられます.
このため,このような警告メッセージが出力されます.
TAB 書式は新しくプログラムを作成する場合には推奨されていない形式です.


「数値データ型にバイト数が指定されました」という警告メッセージが出ます.

integer*2 の様な書式で変数のバイト数を指定する方法は Fortran 標準では拡張機能に位置づけられます.
このため,このような警告メッセージが出力されます.

この警告メッセージを抑止したい場合は,Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き「Fortran コンパイラ > 基本設定 > 警告表示選択 > 表示抑止する警告を選択」を指定した後に「Fortran 77 の拡張仕様 (=x77)」を指定してください.

なお,Fortran Builder(NAG Fortran コンパイラ)では,以下のバイト数指定を受け付けます.

real*4     !単精度実数
real*8     !倍精度実数
complex*8  !単精度複素数
complex*16 !倍精度複素数
logical*1  !1バイト論理
logical*2  !2バイト論理
logical*4  !4バイト論理
logical*8  !8バイト論理
integer*1  !1バイト整数
integer*2  !2バイト整数
integer*4  !4バイト整数
integer*8  !8バイト整数

この書式は新しくプログラムを作成する場合には推奨されていない形式です.
新しくプログラムを作成する場合は,例えば以下のような書き方を推奨します.

integer, parameter :: int8   = selected_int_kind(2)
integer, parameter :: int16  = selected_int_kind(4)
integer, parameter :: int32  = selected_int_kind(9)
integer, parameter :: int64  = selected_int_kind(18)
integer, parameter :: real32 = selected_real_kind(6)
integer, parameter :: real64 = selected_real_kind(15)

などとした上で,例えば 8-bit 整数を使用する場合には以下のようにします.

integer(int8)

また,32-bit(単精度)実数を使用する場合には以下のようにします.

real(real32)

更に定数の指定も,例えば以下のように行うことが可能です.

3.141592653589793238_real64

「KIND 値 (*) が有効な表現方法ではありません」というエラーが出てコンパイルに通りません.

コンパイラによって kind 値の解釈が異なるために出ているエラーです.

多くのコンパイラは kind 値がデータバイト数を表す方法(バイト指定)か,もしくは1番から順番に値を割り振る方法(シーケンシャル指定)のどちらかを採用しています.
Fortran Builder(NAG Fortran コンパイラ)では,後者の順番に割り振る方法(シーケンシャル指定)をデフォルトで採用しているため,データバイト数を表す方法(バイト指定)で書かれたプログラムはこのようなエラーとなります.

Fortran Builder(NAG Fortran コンパイラ)では,コンパイラオプションの指定で kind 値にデータバイト数を利用することが可能です.
Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 基本設定 > Kind モード (-kind=) > バイト (=byte)

を指定してください.

移植性を考えたソースコードを作成する場合には,real(4) などのように kind 値を直接指定せずに,組込み関数 selected_real_kind や kind などを用いて kind 値を間接的に設定する方法(例えば,real(kind(1.0)) など)を推奨します.


「入力バッファにおいてレコードが長すぎます」または「出力においてバッファオーバーフローが発生しました」というエラーはどういう意味ですか?

これはファイルバッファの大きさを超えて formatted 入力または出力が行われたことを意味します.
デフォルトのバッファサイズは 1024 文字です.
これをより大きくする場合には open 文で「recl=バッファサイズ」と指定してください.

open (13, file = "myfile", form = "formatted", recl = 2048)

この例では,バッファサイズを 2048 文字に拡張しています.
また,iolength 指定子を inquire 文で指定して recl 指定子に必要なサイズを求める事ができます.

inquire (iolength = irecl) my_big_array
open (13, file = "dump", form = "formatted", recl = irecl)

この例では,装置 13 に,my_big_array を読み書きするのに必要なサイズを設定しています.


コマンドプロンプトからプログラムを実行すると「Press ENTER to continue--」が表示されずに(一時停止せずに)終了します.

環境変数 NAGFORTRAN_PAUSE_ON_EXIT に何らか値(例えば "A" など,空でなければ何でも良い)を設定すると一時停止が行われるようになります.
この環境変数 NAGFORTRAN_PAUSE_ON_EXIT が未定義な環境では一時停止は行われません.


「変数 ** のサイズ (*********** バイト) が大きすぎます」というエラーが出てコンパイルに通りません.

32-bit 環境で配列の大きさが 2 GB を超えているために出ているエラーです.

32-bit 環境での利用可能メモリの上限は通常 2 GB となっており,そのためプログラムの作成においても配列の大きさ(の合計)の上限が 2 GB までとなります.


「C:¥...¥*.exe は有効な Win32 アプリケーションではありません.」というエラーが出てプログラムが実行できません.

32-bit 環境での利用可能メモリの上限は通常 2 GB となっており,そのためプログラムの作成においてもオブジェクト(配列など)の大きさ(の合計)の上限が 2 GB までとなります.
通常,単一で 2 GB を超えるオブジェクト(配列など)を宣言した場合は,コンパイル時にコンパイラがエラーとして検出します.
しかしながら,2 GB に非常に近い値で超えていない場合や複数の配列の合計が 2 GB に近い値になる場合などは,コンパイラはエラーと認識せずに実行ファイルを生成しますが,実行時に OS 側から 32-bit アプリケーションではないといった旨の警告が出力されることがあります.

コンパイルには通るが,実行できない例:

program runtime_error
  !
  ! 以下の配列 a は,倍精度(8 バイト)× 1024 × 1024 × 255 合計 2GB - 8B です.
  ! コンパイルには通りますが,32-bit 環境では実行できません.
  !
  implicit none
  double precision :: a(1024, 1024, 255) 
  a = 100
  print *, a(1, 1, 1)
end program

デバッグ実行時に「ステップ実行」や「トレース実行」を行っているのにプログラムが最後まで走ってしまい1ステップで停止しません.

メインプログラムの最初の行にブレークポイントを設定した場合に,ブレークポイントがメインプログラムの外側に設定されてしまうために発生する現象です.

これを回避するためには,メインプログラムに program [プログラム名] 文を追加した上で program 文の次の行にブレークポイントを設定してください.

変更前の例:1行目にブレークポイントを設定すると,この現象が発生します.

1: print *, 'Hello World'
2: end

変更後の例:2行目にブレークポイントを設定すると,この現象を回避できます.

1: program main
2: print *, 'Hello World'
3: end

OpenGL のテンプレートプログラムを実行したのですが,ウィンドウを「閉じる」ボタンで閉じてもプログラムが終了しません.

ウィンドウフレーム制御(例えば,質問にあるウィンドウのタイトルバーの右上にある「閉じる」ボタン)を用いて,プログラムを終了した時にこの問題は発生します.
この場合,プログラムはプログラムが終了であることを示す GLUT イベントを得られません.
(これは glutMainLoop() の仕様上の問題で,実際,ウィンドウが破壊される時 glutMainLoop() は exit(0) を単に呼び出すだけです.)

従って,コマンドプロンプトを閉じて(または,Fortran Builder メニューバー「実行 > プログラムの強制終了」から)プログラムを終了してください.


実行ファイル(*.exe)を他の PC で実行しようとすると,lib64f71rts.dll または libf71rts.dll が見つからない旨のエラーが出て実行できません.

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

リンク > オプション > Fortran ランタイムライブラリの非共有(静的)バージョンの結合 (-unsharedrts)

にチェックを入れて,再度ビルドを行ってください.

このオプションを指定しますと,NAG Fortran コンパイラのランタイムライブラリがスタティックにリンクされます.
これにより Fortran Builder(NAG Fortran コンパイラ)がインストールされていないマシンにおいても,実行ファイル(*.exe)を実行させることが可能になります.

※ オプションの詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください.

※ Fortran Builder のプロジェクト設定(または,クイック実行設定)はデフォルトではオプション -unsharedrts にチェックが入っていません

または,ランタイムライブラリをスタティックにリンクしない場合は(つまり,オプション -unsharedrts を付けない場合は),実行ファイルと共にランタイムライブラリが必要となります.
ランタイムライブラリは,[Fortran Builder インストールフォルダー]¥nagfor¥bin フォルダーからコピーしてご利用ください.

64-bit 実行ファイルの場合:

  • lib64f71rts.dll
    通常
  • lib64f71rtssafe.dll
    「スレッドセーフなコードを生成する (-thread_safe) 」付きでビルドした場合
  • lib64f71rtstpc.dll
    「メモリトレースオプション (-mtrace=) 」付きでビルドした場合

32-bit 実行ファイルの場合:

  • libf71rts.dll
    通常
  • libf71rtsgc.dll
    「自動ガベージコレクションを有効にする (-gc) 」付きでビルドした場合
  • libf71rtssafe.dll
    「スレッドセーフなコードを生成する (-thread_safe) 」付きでビルドした場合
  • libf71rtstpc.dll
    「メモリトレースオプション (-mtrace=) 」付きでビルドした場合

注意:
-thread_safe と -mtrace の両方を指定した場合は libf71rtssafe.dll または lib64f71rtssafe.dll をご利用ください.
また,-gc は,-thread_safe および -mtrace とは両立しません.

アプリケーションの再配布についての詳細は,Fortran Builder ヘルプ「32-bit アプリケーションの再配布」または「64-bit アプリケーションの再配布」をご参照ください.


「警告:浮動小数アンダーフローが発生しました」という警告メッセージが実行時に出ます.アンダーフローの発生箇所を調べる方法はありますか?

以下に手順を示します.

1. コンパイラモジュールの設定

弊社コンパイラが提供するモジュール

ieee_arithmetic

を use してください.引き続き,サブルーチン

ieee_set_halting_mode(ieee_underflow, .true.) 

を call してください.

2. コンパイラオプションの設定

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 詳細設定 (1) > 実行時エラーメッセージの出力時にトレースバック情報を出力するコードを生成する (-gline)

にチェックを入れてください.

これにより,アンダーフローが発生した時点でプログラムが停止すると共に,停止した行番号が出力されます.
以下にプログラム例を示します.

program underflow_example
  use ieee_arithmetic
  implicit none
  real x
  call ieee_set_halting_mode(ieee_underflow, .true.)
  read *, x
  print *, x / huge(x)
  print *, "Hello World"
end program

このプログラムを実行して 0.1 と入力すると Fortran Builder のメッセージウィンドウに以下のようなメッセージが出力されます.

実行時エラー: *** 算術例外: 浮動小数アンダーフロー - 終了します
実行時エラー: main.f90(7): エラーがUNDERFLOW_EXAMPLEで発生しました

これにより 7 行目でアンダーフローが発生し,プログラムが停止したことが分かります.

注意:
一般的に,アンダーフローは実行結果に対して致命的な影響を及ぼすケースが少ないため Fortran Builder(NAG Fortran コンパイラ)では「警告」としてメッセージを出力しています.
ただし,アンダーフローが実行結果に及ぼす影響度はプログラム次第となりますし,また,その影響を重大であると考えるかどうかはプログラマー次第となります.


「警告:浮動小数アンダーフローが発生しました」という警告メッセージが実行時に出ます.この警告メッセージの出力を抑止することはできますか?

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

リンク > オプション > アンダーフロー警告の非表示 (-no_underflow_warning)

にチェックを入れてください.

これにより「警告:浮動小数アンダーフローが発生しました」メッセージの出力を抑止することができます.

注意:
一般的に,アンダーフローは実行結果に対して致命的な影響を及ぼすケースが少ないため Fortran Builder(NAG Fortran コンパイラ)では「警告」としてメッセージを出力しています.
ただし,アンダーフローが実行結果に及ぼす影響度はプログラム次第となりますし,また,その影響を重大であると考えるかどうかはプログラマー次第となります.


4倍精度をサポートしていますか?

はい,サポートしています.

Fortran Builder(NAG Fortran コンパイラ)が提供するデータ型の詳細につきましては,Fortran Builder ヘルプ「NAG Fortran Compiler, Release 7.2 マニュアル - 2.17 データ型」をご参照ください.

《 補足1: 変数宣言や定数表現について 》

ポータビリティなどを考えると selected_real_kind 組込み関数を用いて,必要な有効桁数を持つ型の kind 番号を取得する方法が推奨されます.
例えば,以下の例のようなモジュールを利用すると便利です.
(なお 0.1q0 といった表現は Fortran 非標準であるため文法エラーとなります.)

プログラム例:

module my_precision
  implicit none
  ! 有効桁数から種別番号を求めるために selected_real_kind を用いる.
  ! 例えば p = 5 等とすると単精度,p = 15 等とすると倍精度の種別番号が取得される.
  integer, parameter :: wp = selected_real_kind(p = 30)
end module my_precision

program precision
  use my_precision
  implicit none
  real(wp) x     ! wp には指定された有効桁数を持つ型の種別番号が格納される.
  complex(wp) c  ! real と complex で種別番号は対応している.
  x = 0.1_wp     ! このような方法で指定種別の定数表現が可能である.
  c = (0.5_wp, 1.2_wp)
  print *, x
  print *, c
end program

出力例(p = 5):

  0.1000000
(0.5000000,1.2000000)

出力例(p = 15):

  0.1000000000000000
(0.5000000000000000,1.2000000000000000)

出力例(p = 30):

.10000000000000000000000000
(0.5000000000000000000000000,1.20000000000000000000000000)

《 補足2: 組込み関数の個別名について 》

Fortran 標準では4倍精度に対応した個別名は定義されていません.
(例えば,qmax といった組込み関数は Fortran 非標準であるため文法エラーとなります.)
4倍精度に対しては常に総称名(例えば,max)をご利用ください.
なお,今後は4倍精度に限らず(単精度,倍精度に対しても)個別名は使用しないことが推奨されます.


編集記述子 $(改行抑止)はサポートしていないのですか?

サポートしていません.

編集記述子 $(改行抑止)は Fortran 非標準であるため文法エラーとなります.

Fortran 標準では,改行を抑止する場合は write 文において advance = 'no' という指定を行います.
以下にプログラム例を示します.

プログラム例:

program advance_example
  implicit none
  integer age
  write (*, fmt = '(a)', advance = 'no') "Enter your age: " ! 改行なし.
  read *, age
  print *, "Your age is:", age
end program

出力例:

Enter your age: 20
 Your age is: 20

Fortran Builder で作成したアプリケーションの再配布は可能ですか?

はい,可能です.

DLL 形式の外部ライブラリ(グラフィックライブラリや数値計算ライブラリなど)を利用している場合には,実行ファイル(*.exe)と共に該当の DLL が必要となることに注意してください.

アプリケーションの再配布についての詳細は,Fortran Builder ヘルプ「32-bit アプリケーションの再配布」または「64-bit アプリケーションの再配布」をご参照ください.

注意:
LAPACK, OpenGL, GTK+ ライブラリの商用利用時のライセンスについては,各ライブラリのコミュニティ(製造・提供元)にお問い合わせ(ご参照・ご確認)ください.
Fortran Builder ではこれらのライブラリを各コミュニティのライセンスに基づき商用利用していますが,ユーザーアプリケーションでの2次利用につきましては,弊社は一切の責任を持ちません.


Fortran の組込み関数(例えば,CDEXP)がコンパイルに通りません.

Fortran 標準の組込み関数には総称名(例えば,EXP)と個別名(例えば,CEXP)があります.
コンパイルに通らない原因としては,Fortran 非標準の(特定のコンパイラが独自にサポートしている)個別名(例えば,CDEXP)の使用が考えれます.

解決策としては,個別名の代わりに総称名をご利用ください.
個別名は特定の精度に対応しますが,総称名はご利用のコンパイラがサポートする全ての精度に対応しており,引数の型と同じ型の戻り値を得ることができます.

Fortran 非標準の個別名をリストアップすることは不可能ですが,一般的なルールとして,xFUN のような関数の代わりに FUN を使用してください.
ここで x は1文字または複数文字の個別名の接頭辞,FUN は数学関数の名前です.

良く利用される数学関数の名前:
ABS, ACOS, ASIN, ATAN, ATAN2, CONJG, COS, COSH, DIM, EXP, LOG, LOG10, MAX, MIN, SIGN, SIN, SINH, SQRT, TAN, TANH

典型的な個別名の接頭辞:
C, CD, CQ, D, DC, Q, Z

例えば,個別名 CEXP, DEXP, CDEXP, DCEXP, QEXP, CQEXP, ZEXP はどれも総称名 EXP に置き換えても同じ結果を得ることができます.

いくつかの組込み関数については,ルールが若干異なります.
xINT, xNINT(ここで x は上述した個別名の接頭辞)は,AINT, ANINT に置き換えてください.

接頭辞 C または D で始まる個別名の中には Fortran 標準の個別名(例えば,CEXP)もあることに注意してください.
しかし,いずれにせよ現在では(総称名の代わりに)個別名を用いるべき理由は特にありません.


「外部例外 EEFFACE」->「メモリが足りません」というエラーが出てビルドに通りません.

このような場合,64-bit OS 環境で Fortran Builder の別バージョン(FortranBuilder_3G.exe)をお試しください.

具体的には,[Fortran Builder のインストールフォルダー]¥bin フォルダーにおいて以下の操作を行ってください.
(デフォルトでは,C:¥Program Files (x86)¥NAG¥FBuilder 7.2¥bin )

(1) FortranBuilder.exe のファイル名を適当な名前(例えば,FortranBuilder_Original.exe など)に変える.

(2) FortranBuilder_3G.exe のファイル名を FortranBuilder.exe に変える.


RANDOM_SEED で初期化した(シードを設定した)後に RANDOM_NUMBER で乱数を生成したのですが,出力結果が明らかにランダムには見えません.RANDOM_SEED の使い方を教えてください.

RANDOM_NUMBER の擬似乱数発生アルゴリズムはコンパイラに依って異なります.
NAG Fortran コンパイラでは Mersenne Twister を採用しています.

Mersenne Twister は大きな状態ベクトル(630 個の 32-bit 整数)と非常に長い周期(約 106000)を持ちます.
このため,低エントロピーにならないようにシード(630 個の整数値)を適切に設定する必要がありますが,実際のところ,ユーザーがこれを直接行うことは困難です.
(ほとんどの場合,シードが低エントロピーになり,その結果,生成される乱数列にも低エントロピー部分が現れます.)

また,シードはランダムなビット列(2 万個以上の 0 と 1 の列)です.
そして,そのビット列の約半分は 0 でないことが望まれます.
従って,たくさんの小さな整数値をシードに設定することは良くありません.

(1) RANDOM_NUMBER を呼び出す毎に異なる乱数列を得たい場合

RANDOM_SEED を使わずに,RANDOM_NUMBER だけをご利用ください.
(適切なシードが裏で自動的に設定されます.)

プログラム例:

program unique_sequences
  implicit none
  print *,'First sequence'
  call show_random(8)
  print *,'Second (different) sequence'
  call show_random(8)
contains
  subroutine show_random(n)
    integer, intent(in) :: n
    real x(n)
    call random_number(x)
    print 1, x
1   format(99f8.5)
  end subroutine
end program

(2) RANDOM_NUMBER を呼び出す毎に同じ乱数列を得たい場合

初回の乱数生成時に RANDOM_SEED の GET 引数でシードを取得して保存してください.
そして,次回以降の乱数生成時に RANDOM_SEED の PUT 引数でそのシードを設定してくだい.

プログラム例:

program sequence_restarting
  implicit none
  integer rsize
  integer, allocatable :: rseed(:)
  call random_seed(size = rsize) ! シードの格納に必要なサイズを取得する.
  allocate (rseed(rsize))        ! シードの格納領域を確保する.
  call random_seed(get = rseed)  ! 次回も同じ乱数を生成できるようにシードを取得する.
  print *,'First sequence'
  call show_random(8)
  call random_seed(put = rseed)  ! 前回と同じシードを設定する.
  print *,'Second (restarted) sequence'
  call show_random(8)
contains
  subroutine show_random(n)
    integer, intent(in) :: n
    real x(n)
    call random_number(x)
    print 1, x
1   format(99f8.5)
  end subroutine
end program

もし,ご自分でシードに値を設定したい場合は,シード配列の初めの要素に値を設定してください.
そして,残りの要素にはゼロを設定してください.

プログラム例:

program repeatable_sequences
  implicit none
  integer rsize
  integer, allocatable :: rseed(:)
  call random_seed(size = rsize) ! シードの格納に必要なサイズを取得する.
  allocate (rseed(rsize))        ! シードの格納領域を確保する.
  rseed(1) = int(z'1f2d3b5a')    ! シード配列の最初の要素に自身の値を設定する.
  rseed(2:) = 0                  ! シード配列の残りの要素にゼロを設定する.
  call random_seed(put = rseed)  ! シードを設定する.
  print *,'First sequence (always the same)'
  call show_random(8)
  call random_seed(put = rseed)  ! 前回と同じシードを設定する.
  print *,'Second sequence (also always the same)'
  call show_random(8)
contains
  subroutine show_random(n)
    integer, intent(in) :: n
    real x(n)
    call random_number(x)
    Print 1, x
1   Format(99f8.5)
  end subroutine
end program


「crt0_c.c(18): `WinMain' が参照できません.」または「main.c(0): undefined reference to `WinMain@16'」というリンクエラーが出てビルドに通りません.

これらのリンクエラーは,リンクの対象に主プログラムがないことが原因です.

例えば,以下のプログラムは問題なくビルドできます.

subroutine hello
  print *, "Hello World"
end subroutine

program main
  implicit none
  call hello
end program

しかし,主プログラム(program main 〜 end program)を削除して,サブルーチンだけにすると,

subroutine hello
  print *, "Hello World"
end subroutine

コンパイルには通りますが,リンクの段階で主プログラムがないため,上記のリンクエラーが出力されます.


「実行時エラー: *** 算術例外: 浮動小数ゼロ除算 - 終了します」というエラーが出て実行が途中で止まります.

多くのコンパイラ環境では,算術例外(ゼロ除算など)を無視して実行を継続する動作がデフォルトになっていますが,Fortran Builder(NAG Fortran コンパイラ)では,算術例外(ゼロ除算など)が発生した場合,そこで実行をストップしてエラーを出力する動作がデフォルトとなっています.

算術例外(ゼロ除算など)を無視して実行を継続したい場合は,Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

Fortran コンパイラ > 基本設定 > IEEE モード (-ieee=) > 全ての IEEE 算術機能 (=full)

を指定してください.

プログラム例:

program division_by_zero
  implicit none
  call sub(1.0, -2, 0, 2)
contains
  subroutine sub(x, n1, n2, n3)
    real x
    integer n1, n2, n3
    print *, x / n1
    print *, x / n2
    print *, x / n3
  end subroutine
end program
デフォルトでは,ゼロ除算でエラーとなり実行が止まります.
  -0.5000000
致命的なエラーでプログラムが終了しました
コンパイラオプション -ieee=full を指定した場合は,最後まで実行を行います.
  -0.5000000
 Infinity
   0.5000000

「変数 ** はSAVE属性を指定するには大きすぎます(*********** バイト)」というエラーが出てコンパイルに通りません.

静的にメモリに割り当てられている変数(配列)の大きさが 2 GB を超えているために出ているコンパイルエラーです.

Windows OS は(Linux OS とは異なり)2 GB を超える静的メモリをサポートしません.

プログラム例(静的な配列):

program big_array_static
  implicit none
  double precision a(1024, 512, 512)
  a = 8d0
  print '(i10)', int(sum(a), kind=4)
end program

コンパイルエラー:

変数AはSAVE属性を指定するには大きすぎます(2147483648バイト)

このような場合,変数(配列)を動的にメモリに割り当てるようにする必要があります.

動的メモリ割り当ては,allocatable や pointer などを用いて行うことができます.
(詳しくは,手近の Fortran 言語の文法書をご参照ください.)

プログラム例(動的な配列):

program big_array_dynamic
  implicit none
  double precision, allocatable :: a(:, :, :)
  allocate(a(1024, 512, 512))
  a = 8d0
  print '(i10)', int(sum(a), kind=4)
end program

実行結果:

2147483648

「... R_X86_64_PC32 against symbol ...」というリンクエラーが出てビルドに通りません.

プログラムのリンク時に静的メモリが 2 GB を超えている可能性があります.

Windows OS は(Linux OS とは異なり)2 GB を超える静的メモリをサポートしません.

このような場合,静的メモリのサイズが 2 GB 以下になるように,(静的にメモリに割り当てられている)大きなサイズの変数(配列)を,動的にメモリに割り当てるようにする必要があります.

動的メモリ割り当ては,allocatable や pointer などを用いて行うことができます.
(詳しくは,手近の Fortran 言語の文法書をご参照ください.)

プログラム例(動的な配列):

program big_array_dynamic
  implicit none
  double precision, allocatable :: a(:, :, :)
  allocate(a(1000, 512, 512))
  a = 8d0
  print '(i10)', int(sum(a))
end program

実行結果:

2097152000

「このアプリはお使いの PC では実行できません」というメッセージが出てプログラムが実行できません.

プログラムの実行時に静的メモリが 2 GB を超えている可能性があります.

Windows OS は(Linux OS とは異なり)2 GB を超える静的メモリをサポートしません.

プログラム例(静的な配列):

program big_array_static
  implicit none
  double precision a(1000, 512, 512)
  a = 8d0
  print '(i10)', int(sum(a))
end program

実行結果(OS が出すメッセージ):

このアプリはお使いの PC では実行できません

このプログラムは実行時に静的メモリが 2 GB を超えるため,Windows では実行できません.

このような場合,実行時の静的メモリのサイズが 2 GB 以下になるように,(静的にメモリに割り当てられている)大きなサイズの変数(配列)を,動的にメモリに割り当てるようにする必要があります.

動的メモリ割り当ては,allocatable や pointer などを用いて行うことができます.
(詳しくは,手近の Fortran 言語の文法書をご参照ください.)

プログラム例(動的な配列):

program big_array_dynamic
  implicit none
  double precision, allocatable :: a(:, :, :)
  allocate(a(1000, 512, 512))
  a = 8d0
  print '(i10)', int(sum(a))
end program

実行結果:

2097152000

NAMELIST を入力するときに,自動的に他のリストをスキップすることはできますか?

下記の環境変数を設定すると,NAMELIST の自動スキップが可能となります.

《 変数名 》
NAGFORTRAN_RUNTIME_OPTIONS

《 変数値 》
autoskip_namelist

※ Fortran Builder を起動している間だけ環境変数を有効にしたい場合は,Fortran Builder メニューバー「ツール > 環境変数の設定」をご利用ください.

プログラム例:

program main
  implicit none
  integer :: a, b, c, x, y, z
  namelist /list1/ a, b, c
  namelist /list3/ x, y, z
  open (10, file="mynamelist.txt")
  read (10, nml=list1)
  print *, a, b, c
  read (10, nml=list3)
  print *, x, y, z
  close (10)
end program

mynamelist.txt:

&list1 a=1, b=2, c=3 /
&list2 i=4, j=5, k=6 /
&list3 x=7, y=8, z=9 /

プログラムの参照とリストが一致していないため,通常であれば,以下のような実行時エラーとなります.

実行時エラー: sample.f90(9): 変数群/LIST3/が指定されるべきところで/LIST2/が見つかりました

しかし,上記の環境変数を設定すると,プログラムの参照と一致しないリスト(この例では,list2)を自動的にスキップするようになります.

実行結果:

1 2 3
7 8 9

64-bit OS 環境で 32-bit 実行ファイルを生成することはできますか?

はい,可能です.

Fortran Builder メニューバー「プロジェクト > プロジェクトの設定」を開き,

基本設定 > ビットモード > 32-bit

に切り替えてください.

これにより,生成される実行ファイルは 32-bit になります.


Fortran Builder をデフォルト(出荷時の状態)に戻すことはできますか?

はい,可能です.
Fortran Builder をデフォルト(出荷時の状態)に戻すためのユーティリティが Windows スタートメニューに提供されます.

NAG Fortran Builder 7.2 > Fortran Builder 7.2 リセット

適宜ご利用ください.

※ この操作は Fortran Builder を終了した上で行なってください.

※ この操作によって,ユーザー作成のファイル(ソースファイルなど)が消えることはありません.

補足:
このユーティリティは,レジストリに保存されている Fortran Builder の最終起動時の状態(各種設定情報)を削除します.
その結果,Fortran Builder は初回起動時の状態(出荷時の状態)に戻ります.


Privacy Policy  /  Trademarks