問題タブ [fortran-common-block]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
fortran - 共通ブロックの「保存」
COMMON
ブロックを広範囲に使用し、時にはSAVE
ステートメントを使用するレガシーコードを扱っています。Fortran標準を参照した後、次のように述べています。
SAVE
ステートメント内で前後にスラッシュを付けた共通ブロック名の出現は、その共通ブロック内のすべてのエンティティを指定する効果があります。
共通ブロックに変数を配置しても意味がないのはどのような状況SAVE
ですか? 変数は、その共通ブロックを含む他のプログラム単位でアクセス可能でなければならないので、どうしてそれをSAVE
編集できないのでしょうか?
fortran - Fortran 77 で共通ブロック変数の範囲をローカライズする
私はこの F77 コードに取り組んでおり、COMMON BLOCK を広範囲に使用しています。これらの COMMON BLOCK は C プログラムでも使用されています (名前マングリング後)。foo(a, b, ...) が fortran コードのメイン ルーチンである場合、COMMON BLOCKS を foo() に対してローカルにする方法はありますか?
ポイントは、それらのブロックが同じ名前を持っていても、それぞれが独立した共通ブロックを持つ「foo」の複数の呼び出しを持つことです。私が知っている唯一の方法は、「foo」の2番目の呼び出しで共通ブロックと関連するサブルーチンの名前を変更することです。これにより、別のルーチン「foo1」になるため、次のことができます。
しかし、これは確かにありふれたものであり、エラーが発生しやすいものです。
fortran - Fortranでの共通ブロックの使用に関する問題
私は有限要素解析プログラムのFortranサブルーチンを使用しています。2つのサブルーチン間で変数を共有する必要があるため、COMMONブロックを使用しています(編集:モジュールの方が優れています)。問題は、一部の変数のみが他のサブルーチンに渡され、他の変数は渡されないことです。
私のコードは次のようなものです:最初のサブルーチン:
2番目のサブルーチン私は同じ構文を使用します。各サブルーチンのkmom値とkrot値をtxtファイルに書き込むことで結果を制御しています。
結果は次のとおりです。
したがって、krotの値は失われます。どんなアドバイスでも大歓迎です。
João
解決済み:
そして、各サブルーチンで:
c - Fortran 77 は共通ブロック変数をどのように割り当てますか?
C、C++、または Fortran コードで動作するライブラリを C で開発しています。使用するメカニズムの 1 つは、スタック、ヒープ、またはデータ/bss セグメント内のページへの書き込みをトラップすることです。この場合の「ヒープ」は、マップされたファイルからライブラリが作成する特別なヒープです。ライブラリが Fortran アプリケーションの変数への書き込みをトラップできないことがわかりました。変数は次のように宣言されます
ここで、I、J、および K は整数パラメーター (定数) です。次に、コードは「フィールド」と呼ばれる共通ブロックに u を含めます。
GDB の下でデバッグすると、u のアドレスが 3 つのデータ セグメントのいずれの範囲にも収まらないことがわかりました。(そのため、ライブラリは書き込みをトラップできませんでした!) 次に、/proc//maps 疑似ファイルを調べたところ、u のアドレスが、システムが「ヒープ」として注釈を付ける範囲内にあることがわかりました。しかし、どうやってこの「ヒープ」に入ったのですか?この場合の Fortran 77 コードは、非標準の「割り当て」キーワードを使用してヒープに割り当てません。Fortran 77 (Ubuntu Linux x86-64 の下) が「ヒープ」に割り当てる変数と、この「ヒープ」が最初にどのように作成されるかを誰かに説明してもらえますか?
c++ - C++ および Fortran: C++ から Fortran 共通ブロック内の配列にアクセスする際のエラー
C++ から Fortran 共通ブロック構造内の配列にアクセスしようとしています。
C++ と Fortran の混合サンプル コードがあります。
フォートラン:
次にC++で:
C++ から、値を出力しようとするとsample_.b
:
a(2) の値を取得します:sample b:5
そして、他の配列の値を印刷しようとすると、セグメンテーション違反が発生します...
私は何を間違っていますか?¿任意のアイデア¿?
おそらく、配列「a」の長さもC++に渡す必要があると思いますが、そうであれば、その方法もわかりません。
c++ - COMMONステートメントを使用したFortranライブラリを含むC++のコンパイル
いくつかのライブラリを必要とするC++プログラムをコンパイルしています。これらのライブラリのコードはFortranで記述されており、COMMONブロックが含まれています。基本的に私は次のようなことをしています:
Lib1.aとlib2.aはFortranでコーディングされています。
そして、両方とも次のようなものを含むヘッダーファイルを含みます:
COMMONブロックに問題があるようです。たとえば、共通の後に変数の順序を変更したり、新しい変数を追加したりすると、結果がランダムに一貫しなくなります。
COMMONステートメントは可能な限り使用すべきではないことは知っていますが、この場合に何が問題になるのかわかりません。
namespaces - Fortran 名前空間の競合
いくつかのシミュレーション コードを結合する作業を行っています。現在は 3 つのコードがありますが、将来的にはさらに増える可能性があります。次の図で情報交換を考えることができます。
情報交換は、両側の限られたインターフェースを介して行われます。
私は最近、sim1 の共通ブロックが sim2 のサブルーチンと同じ名前を持ち、セグメンテーション違反を引き起こしている問題を診断しました。簡単な解決策は、sim1 の共通ブロックの名前を変更することですが、それは理想的ではありません。なぜなら、sim1 の開発者が sim1-2.0 を発表した場合、その共通ブロックの名前を掘り下げて再度変更する必要があるからです。インターフェイスは比較的限られているため、より良い解決策は単純なモジュールを作成することではないかと考えています。
これにより、sim2 のすべてのルーチンが sim2_mod 名前空間に配置さuse
れ、制限付きで使用できるようになります。これは良い考えですか?悪い考えですか?これが機能しない状況はありますか? sim2 で使用される一般的なブロックにはまだグローバル スコープがありますか?
c++ - 共通のブロックからFortranとC++の混合言語ライブラリを再設計する方法-グローバル構造体エイリアシング?
私は、データベースの読み取りと書き込みを行うC++ラッパーを備えたFortran77で構成されるプログラムを持っています。アプリケーションの2つの部分は、Fortran共通ブロックのような名前のグローバルC /C++構造体を使用する場合に機能を使用してデータを共有します。C ++ / Fortran統合へのこのエイリアシングアプローチは、1)多くのコンパイラスイートで機能し、2)*not8標準であると確信しています。できるだけ標準コンポーネントを使用するようにコードを維持しようとしています。また、この統合は脆弱であることが証明されています。
utd.h:
utd.cpp:
points.i:
もっと良い方法はありますか?共通のブロックをモジュールに変換したいと思うかもしれません。次に、グローバル構造体を使用して共通ブロックをエイリアシングするこのビジネスは、窓の外にあると確信しています。C ++からFortranモジュールをどのように構築しますか?そのようなモジュールからどのようにデータを読み取りますか?
C ++ / Fortran統合についてのあなたのアドバイスは何ですか?
initialization - FortranCOMMONブロックの初期化
ここでのFortran初心者は、Salford / Silverfrostコンパイラー(元の開発者が亡くなりました)を使用して、Fortran77で記述された古いFortranコードベースで作業するように依頼されました。
元の開発者は、名前付きCOMMON
ブロックを広範囲に使用し(グローバル変数、AFAIUをエミュレートするため)EQUIVALENCE
、次のコードスニペットのように必要に応じてブロックを(再)初期化するために使用します。
これは許容できるプログラミング手法ですか、それとも単なるハックですか?また、コードをGFortranに移植しようとしているので、移植可能ですか?(のような宣言REAL*8
はコンパイラへの単なるヒントであり、保証されていないことを理解しています)
fortran - 複数の共通ブロック fortran 77 から複数のモジュールを作成する
現在、私のプログラムには、いくつかのサブプログラムと関数にまたがるいくつかの共通ブロックがあります。変数を追加するときに、共通ブロックのすべてのインスタンスを変更するのを忘れることがあります。これらの共通ブロックをモジュールにして、サブプログラム全体でモジュールのすべてのインスタンスを更新することを心配することなく、変数を 1 か所でモジュールに追加および削除できるようにしたいと考えています。
モジュール内の変数を初期化するプログラムに「use」ステートメントを含める必要がありますか?それとも、モジュールにプログラムを含める必要がありますか? 通常、これには共通ブロックを使用しますが、複雑さが増してもコードが読みやすくなるようにモジュールを実装しようとしています。
注: モジュール内の変数の一部の値は、あるプログラムから別のプログラムに渡されるときに変更できる必要があります。
モジュールに慣れるために簡単なテスト プログラムを作成しようとしましたが、うまく動作しませんでした。私は Fortran 77 に精通していますが、これまでモジュールを使用したことがありません。助けやアドバイスをいただければ幸いです。
gfortran 4.6.1 を使用しています
Main.f