- 「multiple definition of `main'」というリンクエラーが出てプログラムがビルドできません。 [答え]
- プログラムの実行時診断(実行時エラー検出)機能を使うにはどうすれば良いですか? [答え]
- メモリリークがあるかどうかを調べる方法を教えてください。 [答え]
- プログラムの最適化(-On )を行うにはどうすれば良いですか? [答え]
- 固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f95)に変換できますか? [答え]
- ソースプログラムの整形機能(C で言うところの cb の様な機能)はありますか? [答え]
- コールグラフとは何ですか? [答え]
- 混合言語プログラミング時の f90_init と f90_io_finish という関数は何ですか? [答え]
- Fortran 77 のプログラムをコンパイルするには、何らかのコンパイラオプションを指定する必要がありますか? [答え]
- nAG Fortranコンパイラ が私の古い(レガシーな)Fortran 77 のプログラムを受け付けてくれません。 [答え]
- Fortran 77 と Fortran 90/95 のソースファイルが混在しているプロジェクトなのですが、コンパイルは大丈夫でしょうか? [答え]
- CDABS(A)、DCMPLX(X,Y)、DCONJG(Z)、DIMAG(Z)、DREAL(Z) はどうすれば利用できますか? [答え]
- 関数 system はありますか? [答え]
- 関数 getenv はありますか? [答え]
- 関数 flush はありますか? [答え]
- 関数 fdate を含むプログラムのコンパイルができません。 [答え]
- 関数 dtime や etime を含むプログラムのコンパイルができません。 [答え]
- 「TAB 書式入力です(TAB format input)」という警告メッセージが出ます。 [答え]
- 「数値データ型にバイト数が指定されました(Byte count on numeric data type)」という警告メッセージが出ます。 [答え]
- 「KIND 値 (*) が有効な表現方法ではありません(KIND value (*) does not specify a valid representation method)」というエラーが出てプログラムがコンパイルできません。他のコンパイラでは問題なく動いているプログラムです。 [答え]
- 入力バッファにおいてレコードが長すぎます(Record too long for input buffer)」または「出力においてバッファオーバーフローが発生しました(Buffer overflow on output)」というエラーはどういうことでしょうか? [答え]
- 「変数 ** のサイズ (*********** バイト) が大きすぎます(Variable ** size of *********** bytes is too big)」というエラーが出てプログラムがコンパイルに通りません。 [答え]
- 実行ファイルを他のマシンで実行しようとするとエラーが出て実行ができません。 (「libf53.* が見つからなかったため、このアプリケーションを開始できませんでした。 ... 」といった意味のエラーが表示されます。) [答え]
- 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。 アンダーフローがどこで発生したかを調べる方法はありますか? [答え]
- 「警告:浮動小数アンダーフローが発生しました(Warning: Floating underflow occurred)」という警告メッセージがプログラムの実行時に出ます。 この警告メッセージの出力を抑止することはできますか? [答え]
- 4倍精度をサポートしていますか? [答え]
- 編集記述子 $(改行抑止)はサポートしていないのですか? [答え]
- Fortran の組込み関数(例えば CDEXP)をコンパイラが認識しません(コンパイルに通りません)。 [答え]
「multiple definition of `main'」というリンクエラーが出てプログラムがビルドできません。 | |
これはリンク時に複数の主プログラムが存在しているために出ているエラーです。 複数の主プログラムが存在しないかどうか確認して下さい。 |
プログラムの実行時診断(実行時エラー検出)機能を使うにはどうすれば良いですか? | |
プログラムの実行時診断(実行時エラー検出)機能を有効にするには、コンパイラオプションで-Cを設定してください。 例)
nagfor -C myprog.f90
nagfor -C=all myprog.f90
nagfor -C=all -C=undefined myprog.f90 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください。 nAG Fortran コンパイラ は検出された実行時エラーは標準出力へ出力します。
補足: |
メモリリークがあるかどうかを調べる方法を教えてください。 | |
プログラムのメモリトレース(メモリリーク検出)機能を有効にするには、nAG Fortran コンパイラでメモリトレースオプション (-mtrace=) を設定してください。 例)
nagfor -mtrace=all myprog.f90 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください。 メモリトレースの結果は標準出力へ出力されます。 (メモリ診断の出力例) 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')]
注意: |
プログラムの最適化(-On )を行うにはどうすれば良いですか? | |
プログラムの最適化は nAG Fortran コンパイラ のコンパイラオプション -On (n は最適化レベル 0 ~ 4)を指定して行います。 nAG Fortran コンパイラはデフォルトでは「最適化なし」(-O0 に相当)が設定されています。 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.4 コンパイラオプション」をご参照ください。 |
固定形式のプログラム(*.f, *.for)を自由形式のプログラム(*.f95)に変換できますか? | |
はい、可能です。 例)
nagfor =polish fixed.f -o free.f90 nAG Fortran コンパイラのコマンドオプションの指定で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます。 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.24 ソース整形」をご参照ください。
注意: |
ソースプログラムの整形機能(C で言うところの cb の様な機能)はありますか? | |
はい、あります。 例)
nagfor =polish myprog.f90 -o myprogOut.f90 nAG Fortran コンパイラのコマンドオプションの指定で整形内容 (インデント幅や文番号の再設定など)を細かく指定できます。 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.24 ソース整形」をご参照ください。
注意: |
コールグラフとは何ですか? | |
コールグラフとは、コンピュータプログラムの手続き間の呼び出し関係を表現した有向グラフです。 nAG Fortran コンパイラ には「コールグラフの作成」機能が搭載されており、Fortran プログラム(主プログラム、外部副プログラム、モジュール)の手続き(サブルーチン、関数)間の呼び出し関係を出力することができます。 この機能は nAG Fortran コンパイラ のコマンドオプションで =callgraph を指定して下さい。 ※ オプションの詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.21 コールグラフの生成」をご参照ください。 例)
nagfor =callgraph myprog.f90
nagfor =callgraph -calledby myprog.f90
nagfor =callgraph -calledby -index myprog.f90 mysub.f90 -o out.txt 出力例) コールグラフ 2011年12月02日 15:31 1: MAIN 2: SUB コールグラフの索引 行 手続 1 MAIN 2 SUB 呼び出しテーブル 手続 呼び出し元 SUB MAIN |
CDABS(A)、DCMPLX(X,Y)、DCONJG(Z)、DIMAG(Z)、DREAL(Z) はどうすれば利用できますか? | |
CDABS などの組込み関数は Fortran 言語標準の組込み関数ではありませんが、多くのコンパイラがこれら非標準の組込み関数をサポートしています。 これらの非標準の倍精度複素数組込み手続きを有効にするためにはコンパイラオプション -dcfuns を指定して下さい。 |
関数 system はありますか? | |
はい、nAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。 サブルーチン system を利用したプログラム例を以下に示します。 program system_example use f90_unix_proc call system('echo hello') end program |
関数 getenv はありますか? | |
はい、nAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。
しかしながら標準準拠の観点からは、Fortran 2003 から導入された組込みサブルーチン get_environment_variable の利用が推奨されます。 program environment_example ! ! This program displays the values of the environment variables FRED and USERNAME ! (if they exist). ! implicit none call show('FRED') 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 *, 'Unexpected status', status, 'for environment variable "', name, '"' else allocate(character(len) :: value) call get_environment_variable(name, value=value) print *, 'The value of environment variable "', name, '" is "', value, '".' end if end subroutine end program |
関数 flush はありますか? | |
はい、nAG Fortran コンパイラは多くの POSIX システムコールを独自の組込みモジュールで提供しています。
しかしながら標準準拠の観点からは、Fortran 2003 から導入された 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 |
「TAB 書式入力です(TAB format input)」という警告メッセージが出ます。 | |
TAB 書式は Fortran 言語標準では拡張機能に位置づけられます。 |
4倍精度をサポートしていますか? | |
はい、サポートしています。 nAG Fortran コンパイラが提供するデータ型の詳細は nAG Fortran コンパイラマニュアル「nAG Fortran Compiler, Release 7.2 マニュアル - 2.17 データ型」をご参照ください。 《 補足1: 変数宣言や定数表現について 》
ポータビリティなどを考えると selected_real_kind 組込み関数を用いて、必要な有効桁数を持つ型の kind 番号を取得する方法が推奨されます。 プログラム例: 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倍精度に対応した個別名は定義されていません。 |