3

Common宣言を使用してメモリ変数を「共有」するFortran77アプリケーションがあります。当時、メモリが高価で手に入れるのが困難だった頃は、それを回避する方法でした。

制御対象の機器はステータスフラグを設定します。これらのフラグは、これらの共通変数にあります。

C ++で共通機能を実装する方法に関する提案はありますか?

おそらく、すべての一般的な変数がパブリックであるクラス。したがって、そのクラスをインスタンス化するプログラムはすべて、Common変数の内容にアクセスできます。

FortranをCまたはC++に変換するためのチュートリアル/ガイドラインはありますか?

ありがとう

4

6 に答える 6

2

このFortranからC/C ++へのチュートリアルは、次のことを示唆しています。

      FORTRAN:
           DOUBLE PRECISION X
           INTEGER A, B, C
           COMMON/ABC/ X, A, B, C

      C:
           extern struct{
               double x;
               int a, b, c;
           } abc_;

      C++:
         extern "C" {
           extern struct{
               double x;
               int a, b, c;
           } abc_;
         }

extern構造体をC/C ++ファイルが#includeで参照する.hファイルに配置し、正確に1つの.cまたは.cppファイルに、.hファイルにあるものを正確に配置しますが、「extern」という単語は含まれません。

私の仮定は、あなたが始めなければならないことは比較的簡潔で境界線が理解できないことであり、オリジナルとほぼ1対1の対応を維持する方法でそれをC++に変換したいということです。

于 2010-11-30T00:34:47.700 に答える
2

まず、Fortran90モジュールを使用して一般的なブロックを取り除くことができます。

共通ブロックをC++に直接変換する場合は、グローバル/静的変数を大量に作成するか、名前のない名前空間を使用する必要があります。

ただし、これは情報隠蔽に違反するため、ほとんどの人はグローバル変数を無意識に使用しないようにアドバイスします。

より一般的には、Barton-Nackmanの本Scientific and Engineering C ++:Introduction with Advanced TechniquesandExamplesを調べることに興味があるかもしれません。少し時代遅れですが、それほど重要ではありません。これは、Fortran /手続き型のバックグラウンドがあることを前提として、科学またはエンジニアリングアプリケーションのC++を教えます。

于 2010-11-30T00:17:31.503 に答える
1

コメントで言ったことを繰り返していることは知っていますが、誰も理解していないと思います。

「制御されている機器」というフレーズは、プログラムがある種のデバイスドライバーであり、デバイスがそのフラグがメモリの特定の領域にあることを期待している可能性が高いことを示しています。共通ストレージが使用されている理由は、さまざまなモジュールがこれらの領域に直接アクセスして更新できるためです。これらを C extern に変換should することはできますが、適切に行っていることを確認するには、デバイス インターフェイスのドキュメントを入手する必要があります。

一部のポスターが示唆するように、共通のストレージを失うことは、これらの状況ではうまくいきません。時間と自信がある場合の最善のアプローチは、共通ストレージへのすべての更新を処理する静的クラスを用意し、共通ストレージへのすべての読み取りと書き込みを新しいクラスへの「get」と「set」に置き換えることです。

于 2010-12-07T01:45:05.970 に答える
1

Alexandros の回答に対する私のコメントに相応しく、「自然な」音訳は、commonブロック内のすべてを C++ コードのクラス statics として含めることです。結果は適切な C++ コードにはなりませんが、リファクタリングを開始する場所を提供します。

そうは言っても、私は通常、最初に C++ フロント エンドを既存の fortran バック エンドに接続するように試み、それでも良いと思われる場合は翻訳プロセスを開始します。

于 2010-11-30T00:32:38.800 に答える
0

奇妙に思われるかもしれませんが、これはビットフィールドを使用する必要があるような場所である可能性があります。

彼はハードウェアを持っており、おそらくさまざまな制御レジスタとステータスフラグがあり、いくつかの固定メモリアドレスにマップされています。

正しくレイアウトされたビットフィールド(コンパイラ固有)を持ち、そのタイプのポインタが正しいアドレスを指している構造体がうまくいく場合があります。

フィールド値は予告なしに変更される可能性があるため、暴力的なクオリファーが必要になる場合があります。

質問者が共通ブロックのレイアウトとその中のデータの解釈についてより多くの情報を提供するなら、それは助けになるでしょう。

于 2010-12-07T03:13:20.527 に答える
0

まったくそれをしないでください、一般的なブロックは現代のアナテマです。

于 2010-11-30T19:33:48.047 に答える