問題タブ [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.
fortran - fortran 2003に仮想デストラクタはありませんか?
F2k3には仮想デストラクタがないことを正しく理解していますか?
fortran - さまざまなモジュールにわたる Fortran 拡張型
Fortran で拡張された型を使用すると、別のモジュールの型拡張から見えるようにプライベート コンポーネントが必要になります。
gcc4.7 と ifort の両方で、bName が初期型と拡張子の両方にあるため、次のコードはエラーになります。しかし、これは非公開であるため、別のモジュールの拡張ではアクセスできません。つまり、bar_type の bName をコメントアウトすると、非公開であるというエラーが発生します。
bar_type が foo_type と同じモジュールに含まれている場合、bName は bar_type からアクセスできます。つまり、次のコードがコンパイルされます。
最初の例で何が起こるべきかを知るために、標準を解析するのに苦労しています。
function - 型にバインドされたプロシージャを引数として渡す
型にバインドされたプロシージャを引数として別のサブルーチンに渡そうとしています。これがFortranで可能かどうか知りたいです。これが私がやろうとしていることを示すコードスニペットです。
これはFortranで行うことができますか?ifortを使用してこのコードをコンパイルしようとすると、コンパイラエラーが発生します。
fortran - プロシージャ引数を持つジェネリック型にバインドされたプロシージャ
さまざまなコールバック関数をパラメーターとして受け取るジェネリック型にバインドされたプロシージャを作成しようとしています。次のコードをコンパイルすると(ifort 12.1.3を使用)、以下の警告が表示されます。
警告:
プロシージャの引数として使用する場合、コンパイラは異なる関数インターフェイスを区別していないようです...
私の質問は次のとおりです。これらの型がチェックされないのはなぜですか。また、引数としてプロシージャまたはプロシージャポインタを使用して、ジェネリック型にバインドされたプロシージャを作成するための正しいクリーンな方法は何ですか。
考えられる解決策
ウラジミールFが指摘したように、コールバック関数の戻り引数のみが型チェックされます。私の場合は、関数のインターフェイスを少し変更するだけで問題ありません。
fortran - 変数のデータ型に応じて実行する手続きを指定する方法
画像にアクセスしてピクセル値を読み取るモジュールを作成しています。通常、イメージ内の値はさまざまなデータ型 ( integer(2)
、integer(4)
、...) です。これまで、型image
は次のように定義されていました。
私の質問: 画像のデータ型 ( variable に格納されているimage%datatype
) に応じて、プログラムが対応する手順を自動的に見つける可能性はありますか? たとえば、データ型が整数の場合、サブルーチンpxvalues_integer
は の実行中に呼び出されimage%pxvalues
ます。
ありがとう!
oop - Fortranで多形データ型を使用するファイルIO
多くのタイプ(球、平面、NURBSサーフェス、stlファイルなど)のジオメトリを科学的なFortranコードにインポートするためのライブラリを作成しています。type :: geom
この種の問題は、aやthenなどを定義するのが簡単であるため、OOPにとってはテーラーメイドのようtype,extends(geom) :: analytic
です。私が問題を抱えているのはファイルIOです。
この時点での私の解決策は、形状を定義するパラメーターを作成することです。これには、形状を示すいくつかのフラグが含まれます。読むとき、私class(geom) :: object
は(それがどのサブタイプになるかを前もって知らないので)インスタンス化しますが、どうすればそれを読むことができますか?
サブタイプの特定のコンポーネントにアクセスできません。ダウンキャスティングは冗長であり、その上、新しいallocate(subtype :: class)
ものは機能していないようだと読みました。新しいREAD(FORMATTED)
ものはifortやgfortranによって実装されていないようです。すなわち
私はこれについてすべて間違っていますか?ポリモーフィズム以外のものを使用してこれをハックすることはできますが、これは他のすべての場所でよりクリーンに見えます。支援をいただければ幸いです。
編集:IanHのモジュールを使用したサンプルプログラム
generics - ifortコンパイラで一般的な内部プロシージャを使用する
以下はgfortranまたはf95で機能しますが、ifortでは機能しません。
ifortはこのエラーを返します:
どのモジュールプロシージャも使用できず(モジュールにaddrとaddiを含めたくない)、ifortをコンパイラとして使用する必要があると想定します。どんな助けでもいただければ幸いです。
c - Cで(動的に割り当てられた)Fortran配列にアクセスする方法
私の主な質問は、なぜ配列がそのような奇妙なことをするのか、そして「クリーンな」方法で次のことを行う方法があるかどうかです。
私は現在、おおよそ以下のコードのように、foo.c
FortranプログラムとインターフェースするCプログラムを持っていbar.f90
ます。dlopen/dlsym
foo.c:
bar.f90:
主な利回りを実行します
これは、Fortranが配列を正しく割り当て、指定された値を正しく格納していることを示していますが、dlsymを介してアクセスできなくなりました(そのデータで作業するとsegfaultが発生します)。固定サイズの配列でもこれを試しましたが、結果は同じです。
誰かがこの行動の理由を知っていますか?個人的には、双方向で動作するか、まったく動作しないことを期待していました。この「FortranはC配列を受け入れますが、その逆はありません」ということで、この方法でCから配列にアクセスする際に基本的な間違いがあったのではないかと思います。
もう1つの(そしてさらに重要な)質問は、これらの「正しい方法」のような配列アクセスをどのように行うかです。現在、「Fortran as .so」インターフェースに固執することが良い方法であるかどうかさえわかりません。この場合、混合プログラミングを試みることも可能だと思います。それにもかかわらず、配列の問題は残っています-これはISO Cバインディングを使用して何らかの方法で解決できることを読みましたが、まだその方法を理解できませんでした(Fortranではあまり作業していませんが、特に上記のバインディングでは作業していません) 、この問題についてのヘルプをいただければ幸いです。
編集:
さて、私はISO Cバインディングをもう少し読んで、ここで非常に便利なアプローチを見つけました。を使用C_LOC
すると、Fortran構造体へのCポインターを取得できます。残念ながら、配列へのポインタはポインタへのポインタのようであり、C配列として扱う前に、Cコードで逆参照する必要があります。
編集:
少なくとも大部分は、ウラジミールFが指摘したように、Cバインディングを使用してプログラムを動作させることができました。CファイルとFortranファイルがリンクされたので、少なくともFortranの部分ではlibdlインターフェイスを回避できます。動的Cライブラリをロードし、そこにあるシンボルの1つへの関数ポインターを取得して、それを渡す必要があります。後で計算の一部としてその関数を呼び出すFortranへの関数ポインターとして。上記の関数はdouble*s [arrays]を期待しているので、奇妙なことに、C_LOCを使用してFortran配列を渡すことができませんでした。C_LOC(array)
またC_LOC(array(1))
、正しいポインターをC関数に戻すこともできませんでした。array(1)
しかし、トリックをしました。悲しいことに、これはこれを行うための「最もクリーンな」方法ではありません。誰かが私にこれを使用してこれを行う方法のヒントを得た場合C_LOC
機能、それは素晴らしいでしょう。それにもかかわらず、私はそれがより安全な解決策であると考えるので、ウラジミールFの答えを受け入れます。
fortran - Fortran 2003 での null 引数のテスト
再帰型を宣言しました:
「IsNull」関数を実装したいと思います。
Gfortran はポインター属性について不平を言います:
ポインター属性を削除して、ターゲット属性に置き換えた (または何も置き換えなかった) 場合、関連する構成を使用できません。また、gfortran では null() と同等かどうかをテストすることもできません。
質問: 実際の引数が null であることをテストするにはどうすればよいですか?
fortran - Fortran 2003 の総称手続き
fortran には、ユーザーがいくつかの特定の手続きを定義し、それらのインターフェースをインターフェース・ブロックにまとめることを可能にする汎用手続きの概念があることを知っています。ただし、ジェネリック関数の実装を 1 つだけにすることでコードの重複を取り除くことができるかどうかは不明です。
例として、固有の SIN 関数を考えてみましょう。実数と倍精度の両方の引数を受け入れることができます。これは、まったく同じコードを持つ SIN_REAL と SIN_DOUBLE_PRECISION という 2 つの実装があるということですか?
初歩的な質問で申し訳ありません、私はFortranの初心者です。読んでくれてありがとう。