問題タブ [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.
oop - Fortran でのコピー/貼り付けを回避するための適切な OOP 設計
以下の最小限の作業例を考えると、呼び出しのコピー/貼り付けを避けるために変更したいと思います
と の両方main_func_problem1
でmain_func_problem2
。理想的には、タイプおよびmain_func
の入力パラメーターに対して異なる動作をする 1 つの関数が必要です。基本型のパラメーターを宣言することはできますが、実際の引数の型に応じてその関数内にスイッチを (を使用して) 持つことは、アーキテクチャ上良くありません。t_parameters_problem1
t_parameters_problem2
par
class(t_parameters_base)
select type
これを解決するために、これらのルーチンを呼び出すprocedure
in typeを作成してt_parameters_base
、次のようなものを実装しようとしました (C++ 構文):
しかし問題は、これらのルーチンがこのタイプの入力パラメーターを使用しているため、循環依存が発生することです。この問題をどのように解決できますか?
func_some_calc1
更新: クラスのいくつかのプライベート関数を使用して非常に異なるロジックを実装するため、 と の実装をfunc_some_calc2
異なるファイル (モジュラス/クラス)に保持したいことに注意してください。
fortran - fortran の関数に、割り当ての左側に配置できる参照を返すようにします。
タイトルにあるように、関数から取得したポインターを介してアクセスするデータを直接変更したいと考えています。割り当て (=) の左側にある関数によって返される参照を持つことは、C++ では問題ありませんが、次の Fortran の最小限の例ではエラーが発生します。
この動作を達成する方法はありますか; 多分私はいくつかの属性がありませんか?次のようなセッタールーチンの作成をバイパスしたい
配列の外観を模倣する必要があるためです。私のアプリケーションでは、メンバー変数a,b,c
は実際には異なるサイズの配列です
get(i,j)
ゲッターにポインターのマトリックスを模倣させたい
wehreXX
は を参照していnull()
ます。
更新: gfortran (バージョン 5.2.0) を使用しており、展開マシンには 4.6.x 以降のバージョンしかありません。したがって、提案された fortran 2008 標準機能は、残念ながら私には利用できません。すぐに使用できるコンパイラを使用せずに、上記の動作を模倣することは可能ですか?
更新2: 次のように構造を実装することになりました
私はこのように初期化します(最後に言及する私の三角行列アプリケーション)
そして、私はそれにアクセスして書き込みます
これはまさに私が求めていたものではありませんが、私のアプリケーションには十分です。
dll - Fortran 2003 クラスの dll を作成する方法
大規模な fortran コード ベースがあり、その一部を dll に移動したいと考えています。いくつかの調査を行った後、選択した IDE (code::blocks) で通常のfortran dllを構築する方法と、それを別のfortranプログラムで使用する方法を知っています。しかし、壁にぶち当たりました。dllにプロシージャを入れるだけでよい限り、すべてが桃色です。しかし、私がやりたいことは、Fortran プログラムでもそのクラスを使用できるように Fortran 2003 クラスを組み込むことです。最初の問題は、クラスをモジュールに埋め込む必要があることです (これは、DLL 用の通常の Fortran ファイルとはわずかではありますが重要な点で異なります)。これ自体は、dll を構築する上では大きな問題ではありませんが、サブルーチンやクラスにアクセスしようとする場合には問題になります。
現在、プログラムに use ステートメントを含める必要がある一時的な解決策があります。また、モジュール ファイル mydllmodule.mod をプログラムのモジュール ディレクトリに配置します。
fortran クラスを含む fortran dll を作成し、メイン プログラムでそれらにアクセスできるようにするより良い方法はありますか (コンパイラ固有のプラグマを使用せずに)。本番用に HPC でコンパイルして実行します)。私は、ユーザーの生活が可能な限りシンプルになるセットアップを探しています (つまり、dll をどこかに置くだけで、use ステートメントを使用することもできます)。
ありがとう
oop - さまざまな (曲線作成) クラスの移植可能な (ルート ファインダー) ソルバー クラスを作成する
私は、FORTRAN 2003 (F2003) のオブジェクト指向プログラミング (OOP) 機能を実装することに非常に熱心です。私の質問は、プログラムの設計に関するものです。関数f(x)=0のルート ファインダーのような、ソルバーがあるとしましょう。FORTRAN の最も単純な形式では、次のような形になります。
f95 のような以前のバージョンの FORTRAN では、移植性を得るために、コードは個別にコンパイルされ、外部関数がソルバーに渡されます。F2003 OOP の観点から、一般的なケースでソルバーのクラスがあるとしましょう
そして私たちの曲線のための別のクラス
より多くの異なる曲線クラス (タイプ) があります。さて、これらの 2 つの概念をソルバー クラスをコンパイルする方法で (曲線のクラス/タイプを知らずに) 接続するにはどうすればよいでしょうか。また、新しい別の曲線クラス (2nd_order_polynomial_curve など) を作成するたびに、変更せずにそれを実装できます。 、3rd_order_polynomial_curve、log_curve、exp_curve、...)。つまり、最後に、どういうわけか曲線の根を取得します。
oop - Fortran .mod ファイルが大きくなりすぎる
Fortran プロジェクトでは、Fortran 2003 でオブジェクト指向プログラミングを行っているため、モジュールを多用しています。現在、約 7 つの異なるレベルを持つオブジェクトの階層があります。私たちにとっての問題は、高レベルのモジュールとファイルが数行しかない場合でも、コンパイルにかなりの時間がかかることです。
作成されたファイルを見ると、これの原因として考えられるのは、非常に大きな .mod ファイルが書き込まれていることです。これらのファイルを調べると (たとえば gfortran 4.6 の場合)、再帰的に使用されるすべてのオブジェクトとモジュールの完全なインターフェイスが、各高レベルの .mod ファイルに含まれていることがわかります。これらのファイルは、圧縮形式で保存される gfortran 4.9 でははるかに小さくなりますが、それでも非常に大きく、コンパイル時間が遅くなります。
各モジュールでプライベート ステートメントを使用しようとしましたが (現在のモジュールを使用するだけでは、基になる使用済みモジュールが表示されないようにするため)、結果の .mod ファイルのサイズには影響しません。
この問題を解決できるプログラミング方法やコンパイラ ディレクティブはありますか?
fortran - 割り当て可能なコンポーネントで定数という名前の派生型の値を設定する方法は?
これは正しくコンパイルされます:
コンパイルされないことを除いて、次のようなものを書きたいと思います。
gfortran のエラー メッセージ
正しい構文についての手がかりはありません。
割り当て可能な型でパラメーター変数を宣言しようとしても何の不満もありませんので、それを初期化する何らかの方法があるに違いないと思います!
fortran - 手続きポインタ配列の自動初期化
プロシージャ ポインタの定数配列を自動的に初期化する方法はありますか?
整数変数の値に応じて呼び出す必要がある一連のルーチンがあります。ステートメントを使用する代わりに、select case
以下に示すようにプロシージャ ポインターを使用したいと思います。ただし、プロシージャ ポインタ配列の明示的な初期化をスキップして、ラップされたプロシージャ ポインタの定数配列として定義できればよいのですが。以下のコードは、私が見つけた解決策を示しています。コメント行は、達成したい目標を示しています。
fortran - コンパイル時に型がわかっている場合、ポリモーフィック派生型を持つサブルーチンを呼び出す追加のオーバーヘッドはありますか?
同じ抽象型 ( ) から拡張された 2 つの派生型 (child1 と child2) がありtype, abstract :: parent
ます。抽象型には遅延バインド プロシージャがあります。
入力として渡された子のタイプに応じて、何らかの処理 (パフォーマンスが重要) を実行するサブルーチンを呼び出したいと考えています。次の 2 つのオプションが考えられます。
- サブルーチンは
class(parent), intent(inout) :: type_in
を入力として受け取ります。select type (type_in)
子の実装は、コンストラクト内で行われます。 type(child1), intent(inout) :: type_in
1 つは with で、もう1 つは with で、2 つのサブルーチンを作成しtype(child2), intent(inout) :: type_in
、ルーチン名をオーバーロードするための明示的なインターフェイスを提供します。
最初のオプションは、コンパイル時に親の拡張が不明な実装を可能にしますが、私の場合は必要ありません。また、一部のコードのみが子と異なるため、コードの行数も節約できます。
私の質問は次のとおりです。コンパイル時にタイプがわかっている場合、入力をポリモーフィック データとして実装したため、オプション 1 に追加のオーバーヘッドがありますか?