14

最終年度プロジェクトの一環として、FORTRANコードをCまたはC ++に変換する必要があります(理解できる限り、どちらの言語でもかまいません。Cスタイルの言語も理解できます)。

FORTRANをCに変換するプログラムであるf2cを発見し、手順に従って、makefile.vcファイルをドライブに保存してからインストールしようとしました。

copy makefile.vc makefile
nmake

(これは、f2cダウンロードページに含まれているf2cのインストールに関するREADMEファイルの一部です)

LinuxまたはUnixシステムでf2cをコンパイルするには、makefile.uをmakefileにコピーし、必要に応じてmakefileを編集し(以下のコメントを参照)、「make」(またはシステムによっては「nmake」)と入力します。

Microsoft Visual C++を使用するMSWindowsシステムでf2c.exeをコンパイルするには、

makefile.vcmakefilenmakeをコピーします

他のPCコンパイラでは、xsum.cを-DMSDOS(つまり、MSDOS #defined)でコンパイルする必要がある場合があります。

コンパイラがANSI/ISO C構文を理解していない場合(つまり、K&R Cコンパイラを使用している場合)、-DKR_headersを使用してコンパイルします。

ファイルに個別のバイナリモードとテキストモードがある非Unixシステムでは、「makexsum.out」ではなく「makexsumr.out」が必要になる場合があります。

x64ビットバージョンのWindowsVistaを実行していて、「nmake」を試しましたが、

'nmake'は、内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません。

検索後にNmake15.exeをダウンロードしましたが、x64ビットマシンでは動作せず、動作するバージョンがないようです。そこで、動作すると言われた後、Windows SDKをダウンロードしましたが、何も変わりませんでした。

もしそうなら、私はこれらすべてでどこで間違っていましたか、そしてそのFORTRANコードをCまたはC ++に変換する方法はありますか?

4

11 に答える 11

10

私は寓話 という名前の小さなツールキットがあることを発見しました-そのような変換専用の自動FortranからC++への変換。

THereはそのようなツールのレビューでもあります。レビュー著者からの要約:

バックグラウンド

科学計算では、Fortranは20世紀の後半のほとんどを通して主要な実装言語でした。この間に蓄積された多くのツールは、現在オブジェクト指向言語によって支配されている最新のソフトウェアと統合するのが困難でした。

結果

大規模な科学ソフトウェアプロジェクトの要件に基づいて、FABLEという名前のFortranからC++へのソースからソースへの変換ツールを開発しました。これにより、言語を切り替えながらも新しいメソッドの継続的な開発が可能になります。3つの主要なプロジェクトでのFABLEのアプリケーションを報告し、FortranとC++のランタイムパフォーマンスの詳細な比較を示します。

結論

私たちの経験によれば、ほとんどのFortran 77コードは、元の開発時間(多くの場合、年単位で測定)と比較してわずかな労力(日単位で測定)で変換できます。FABLEを使用すると、ポータブルで保守可能な方法で、最新のオブジェクト指向環境でレガシー作業を再利用および進化させることができます。FABLEは、制限のないオープンソースライセンスの下で利用できます。FABLEでは、Fortranソースの分析はC++ソースの生成から分離されています。したがって、FABLEの一部を他のターゲット言語で再利用できます。

于 2015-09-26T07:54:22.687 に答える
5

F77コードがあれば、f2cが最適です。F90以降を使用している場合、f2cは役に立ちません。-aスイッチを覚えている限り、私はf2cを何度も使用して大成功を収めてきました。

余談ですが、私はf2cを史上最高のコードの1つとして評価します!

于 2010-11-30T19:31:53.367 に答える
4

なぜこれをしているのかを明確にする必要があります。必要な機能が一部のレガシーFORTRANでのみ利用可能であるためですか?私は何年も前に、FORTRANでのみ利用可能な一般的な行列反転アルゴリズムが必要だったときにこの問題を抱えていました。理解するのは簡単ではありませんでした-G(J)のような名前のコメントや変数はありません。f2cを使用してCに変換したところ、完全に実行されました。しかし、理解するのはさらに困難でした。2つのポイントは、FORTRANが1からカウントし、Cが0からカウントするため、i+1とj-1がたくさんあったことです。また、引数は参照によって実装する必要がありました。

後でこれをJavaで実行する必要がありました。まだ他のアルゴリズムがないので、CをJavaに変換しました。これは本当に苦痛でした。そして、私はまだ何が起こっているのか理解していませんでした。

そして1、2年後にそれは機能しなくなりました!

しかし、幸いなことに、現在、いくつかのJava実装があります。

したがって、実際の要件を説明できれば、私たちがお手伝いできるかもしれません。これが課題ではないことを願っています。もしそうなら、それは(IMO)貧弱なものだからです。魔法のレガシーコードがある場合は、可能な限り最新の同等のコードを見つけるように努力することをお勧めします。

于 2010-12-05T16:54:59.483 に答える
3

あなたはこれについて本当に明確ではありませんが、あなたはコードを研究したいと思っているようです、そしてそれをするためにあなたはそれをCまたはC++に変換したいと思います。コードを研究するのではなく使用したい場合は、ここではオフベースなので、Fortranコンパイラーを探す必要があります。

あきらめる。慣用的なFortranを慣用的なCまたはC++に変換する方法は見つかりません。言語間には微妙な意味上の違いがあり、それを正しくするためには、翻訳プログラムは非常に正確で、多くのことを説明し、あいまいな関数呼び出しを行う必要があり、それは非常に混乱する可能性があります。読み取り可能なCまたはC++は取得できません。

代わりに、Fortranの適切なバージョンを学ぶ必要があります。CとC++を理解していれば、学ぶのはまったく難しいことではありません。それは単なる別の言語であり、新しい概念の邪魔になることはあまりありません。

于 2010-11-30T20:27:20.060 に答える
3

私がこれまで変換に使用してきた方法は半自動化されています。多くのエディターとテキストスクリプトです。

まず、すべてのFortranソースを1つのファイルにコリメートします(ファイルを再分離できるように、必要に応じてマーカーを配置します)。

次に、数値ラベルを名前付きラベルに変換します(たとえば、gotosの場合はそれらの前にLを追加し、フォーマットの場合はFを追加します)。ラベルを参照する場所に適切な変更を加えます。

次に、ラベルにマークを付けます-組み合わせとステートメントの継続を続行します(たとえば、それらが発生する各行の先頭にマークを付けます)。次に、label-continue行とstatement-continuation行を再結合します。viのようなエディターでは、一連の(たとえば)1000Jを実行し、行の先頭マーカーが#の場合は大規模な置換:%s /#/ ^ V ^ M/gを実行することを意味します。継続ラインは、do-continueコンボと同様に特別にマークされているため、再結合されます。

if-labelsとdo-labelsが分離されていることを確認します(たとえば、grepパターンを記述して関連する行を抽出し、次にそれらをチェックアウトするための単純なブラケットマッチングプログラムを記述します)。分離したら、do-continueを括弧に変えることができます。

if-then-else、dowhile / enddo、subroutine/endsubなどを括弧に入れます。サブルーチンを無効にし、基本タイプ(ブール、文字、整数、実数、倍精度、複素数、複素数など)の偽の名前をポニーアップします。

コメントはC++に変換されます//コメント; 列0と!の両方 コメント。

次に、関数のプロトタイプを再作成できます。これは事実上KRからANSI-Cへの変換であり、関数ヘッダーと変数宣言を読み取ってそれらを一致させるための単純なプログラムが必要です。理想的には、最初に変数宣言を1行にまとめることができます。これには、編集スクリプトとユーティリティも必要です。たとえば、「Double A、B、C、...」は「#Double \ nA \ nB\n」に変換されます。次に、ユーティリティが設定され、すべての非#行の前に最新の#行が付加されます。

パラメータステートメントは型宣言に再結合され、「const」ステートメントに変換されます。保存は静的宣言に変換されます。コモンズ私はまだうまくいく方法を見つけていません。

次に、HARDの部分があります。配列のディメンション化、変数の入力/出力分析(値または参照で渡す必要のある変数を決定するため)。参照型を認識するCコンパイラを入手するか、C++を使用する必要があります。配列の再ディメンション化の場合は、[]を再定義できるC++に移行する必要がある場合もあります。

インアウト分析は、再ディメンション化と同様に、私がまだ取り組んでいないものです。ただし、この時点では、関連するソースは、この段階ではほとんどCまたはC++です。

警告:Fortran 2010では、CおよびC ++を超える並列処理が可能です(マルチスレッド機能を除く)。プログラムにこれらが含まれていると、事態はさらに困難になります。

于 2014-11-21T22:45:03.043 に答える
2

Windowsにf2cをインストールする必要がある場合は、Cygwinを使用します。今ではg77がありますが、f2cを使用する人はもう多くないと思います。

于 2010-11-30T13:29:22.053 に答える
2

私はあなたの質問の最後の部分だけに答えるつもりです:

そのFORTRANコードをCまたはC++に変換する方法はありますか?

はい、あります。Fortranコードを読み取り、同等のCステートメントをCファイルに書き込みます。どちらも命令型言語です。構文は異なりますが、デコードすることは不可能ではありません。これにより、自動コンバーターよりもはるかに優れた結果が得られる可能性があり、元のプログラムがどのように機能するかをより深く理解することもできます。

于 2010-11-30T19:38:36.757 に答える
2

FORTRANからCまたは手続き型バージョンのC++への/からの直接変換は複雑であってはならず、主にFORTRAN実装の内部動作を学習するために推奨されます。

のような自動ツールは、次のようf2cな二重アンダースコアを持つ厄介なコードを生成します:(__i私はループカウンター変数です)。

于 2016-05-13T09:12:32.850 に答える
1

バイナリを試しましたか?

于 2010-11-30T13:28:49.090 に答える
1

MSのVisualStudioをインストールしていますか?その場合、nmakeはVisual Studioコマンドラインで使用できます(通常のコマンドラインではありません)。そうでない場合は、おそらくそれをダウンロードしてインストールしてみてください。

于 2010-11-30T13:29:36.823 に答える
1

の出力は、ここで入手できるプログラムをf2c使用して、より読みやすいC /C++ソースに変換できます。f2cpp

f2cPythonで記述されており、Linuxではシェルスクリプトなどで一緒に呼び出すことができます。

#!/bin/bash

f2c -a -C++ -p *.f
c2cpp.py *.c

ここで、Fortran固定形式をCおよび人間が読める形式のC /C++ソースにf2c変換します。c2cpp

ライセンスはGPLです。

于 2020-02-07T13:55:23.757 に答える