問題タブ [fortran2003]

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.

0 投票する
1 に答える
763 参照

stack - fortran : 最小限のスタック データ構造を作成しようとしています

最後に、SO のスタックに関する質問です。私の人生はすべて、私をこの点に導きました。

そのため、作成したかなり大きなカスタム データ構造をスタックに組み込む必要がありました。1 つの整数値のみで構成される最小限のスタック構造を作成することにしました。ここにあります -

結果はかなり驚きました!カウンターがついていけるか不安SIZEでしたが、これはありません。

私がどこで間違ったのかについての指針はありますか? IDEONE のコードへのリンクは次のとおりです。
編集: IDEONE リンクには、ソリューションが組み込まれた更新バージョンのコードが含まれるようになりました! スタックの汎用テンプレートとして再利用できることを願っています!

0 投票する
1 に答える
1541 参照

oop - Fortran 2003 での型バインド プロシージャのオーバーロード

私は Java でプログラミングをして数年になります。ただし、現在、Fortran をサンプル コード (77 標準) として使用するコースを受講しています。私は常に Fortran を古い言語と見なしてきましたが、gfortran コンパイラーを使用して 2003 標準の最新の実装を試し、そのメリットを自分の目で確かめることにしました。これまでのところ、最新の機能には驚かされましたが、以下の例で示されている 1 つの問題に遭遇しました。

これにより、コンパイル エラーが生成されます: 「(1) の引数 'this' の型が一致しません。TYPE(type2) を CLASS(type1) に渡しました」というcall myType2%computeステートメントへの参照。

私の問題は範囲の問題です。ステートメントを通じて、class(<class_name>) :: thisコンパイラはサブルーチンを特定の派生型またはその子孫にバインドできるはずです。ここから、コンパイラがサブルーチン内でローカルに開始して の特定のインスタンスの祖先ツリーを上に進む変数定義を検索することは概念的に難しくないようですthisthis%これにより、いくつかのステートメントの後で、型にバインドされたプロシージャが読みにくくなる傾向がある明示的なステートメントがすべて削除されます。例えば、

よりも読み取り/書き込み可能性がはるかに低いようです

後者の場合、class(<class_name>) :: this各変数をどこにバインドする必要があるかは、ステートメントから明らかです。

もう 1 つの結果は、2 つの別個の派生型が同じ名前のバインドされたサブルーチンを持つことができないように見えることです (エラー メッセージが示すように)。これを回避する 2 つの一般的な方法を見てきました。compute_type1まず、各サブルーチンをandのように明示的に呼び出しますcompute_type2。これらのサブルーチンにアクセスすると、コードが非常に見苦しく冗長に見えます。たとえばcall myType1%compute_type1。2 番目のオプション (たとえばOverloaded fortran interface with different ranksType-bound function overloading in Fortran 2003を参照) の方が適切と思われるのは、バインド名とプロシージャ名を区別することです。たとえば、型定義には以下が含まれます。procedure :: compute type => compute_type1. これにより、サブルーチンにアクセスする際の問題は解決しますが、同じバインディング名を実装する多くの派生型を持つ大規模なプロジェクトを開発する際に問題が発生することがあります。特定のプロジェクトで使用したサブルーチン名と使用していないサブルーチン名を追跡する必要はありません。これにより、名前が非常に長くなり、最終的に読みにくくなる傾向があります。

だから私の質問には3つの要素があります:

  • this%<var_name>型バインド プロシージャのクラス メンバーの明示的な型付けに代わる、よりクリーンな方法はありますか?
  • class(<class_name>) :: thisステートメントに基づいてプロシージャをバインドする必要があることをコンパイラに認識させる方法はありますか? サブルーチン/関数名をオーバーロードする現在の方法は、これらを型にバインドすることを許可していない 90/95 標準のアーティファクトのようです。
  • そうでない場合、この実装に関連するパフォーマンスの向上はありますか? これらの問題は両方とも、コンパイル時に対処できるように思われますが、表現力を向上させるために喜んで犠牲にします。
0 投票する
1 に答える
97 参照

oop - データ型の各インスタンスでのプロシージャ コピー

パス プロシージャ ポインタを持つデータ型 (クラス) から複数のインスタンスを作成する場合、各インスタンスに実際のプロシージャ (サブルーチン/関数) がコピーされますか? それとも、ポインターだけがコピーされますか?

たとえば、正しくコンパイルおよび実行される次のコードを考えてみましょう。

データ型 から作成された 10 個のオブジェクトのそれぞれで、サブルーチンadd_itが重複していますclass_typeか? または、サブルーチンの命令セットとadd_itそれへのポインタがどこかに保存されていますか、つまり"procedure :: add => add_it" 各オブジェクトにコピーされていますか?

0 投票する
1 に答える
652 参照

fortran - Fortran; 共通の属性を持つファイル名をループする

私は Fortran を初めて使用し、ファイル名に問題があります。simuln#.res (1<#<20) に大量のデータがあり、すべて同じ simuln#.res を持つ複数の異なるディレクトリがあります。名前が異なりますが、入力パラメータが異なります。コードは次のようになります。

コードは私のMacのgfortranコンパイラでコンパイルされますが、ファイルを含むディレクトリへのパスを入力すると、エラーが発生しますsimuln1.res does not exist(これは絶対に行われ、トリプルチェックされます)。編集記述子を変更しようとしました (そして、real(j) を作成しようとしました) が、それでも同じ結果が得られます。誰でも私を助けることができますか?

0 投票する
1 に答える
1101 参照

oop - Fortran、(1)のファイナライズは未実装

単純なファイナライザーを実装しようとしていますが、この例でさえコンパイルできません:

GNU Fortran (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7) を使用すると、次のエラー出力が表示されます。

$ gfortran -c m_example.f03 m_example.f03:5.26:

TYPE, EXTENDS(t1) :: t2 1 エラー: (1) でのファイナライズはまだ実装されていません m_example.f03:10.26:

TYPE, EXTENDS(t2) :: t3 1 エラー: (1) でのファイナライズはまだ実装されていません

これはバグですか、ファイナライザーがまだ gfortran に実装されていないということですか、それとも何か間違っていますか?

0 投票する
2 に答える
285 参照

arrays - 動的サイズの Fortran 配列、R 関数 seq() と同じくらい簡単

R 関数 seq() のように機能する Fortran コードを書きたいと思います。例えば:

ベクトルを与える

シーケンスの長さが変化するいくつかのシミュレーションを実行します。R では、seq() の 2 番目の引数を変更するだけで簡単に実行できます。Fortran で動的配列と配列のサイズを動的に変更する関数 ALLOCATE を使用して、このようなことを試みました。これはこれまでのところ機能せず、エラーにつながります

そのため、Fortran で R 関数 seq() の動作を模倣する簡単な方法があるかどうか疑問に思っていました。

詳細については、以下のプログラムを参照してください。