2017-06-14 13 views
0

externを使用してinterfaceをCにインポートするにはどうすればよいですか?FortranからC言語へのインターフェイスモジュールプロシージャのインポート

は、私は次のFortranモジュールがあるとします。

!swapper module 
module swapper 
    interface swap 
     module procedure swap_r, swap_i, swap_c 
    end interface 
contains 
    !subroutine implementations here: 
    !swap_r takes two double precision as argument 
    !swap_i takes two integers as argument 
    !swap_c takes two characters as argument 
end module swapper 

は、その後、私はちょうど、Cに次の操作を行うことができますか?

また
extern "C" void __swapper_MOD_swap(double*, double*) 
extern "C" void __swapper_MOD_swap(int*, int*) 
extern "C" void __swapper_MOD_swap(char*, char*) 

、私は排他的にこれを行うことが、唯一の倍精度数でswapを呼び出すことを約束している場合?

extern "C" void __swapper_MOD_swap(double*, double*) 
+0

これはおそらくあなたを助けます。http://docs.cray.com/books/S-2179-52/html-S-2179-52/ppgzmrwh.html – Stargateur

+1

Cにはジェネリックはありませんが、C++にはジェネリックがあります。そして、Cに 'extern" C "'はありません。あなたは実際にC++を使用していますか? –

+0

これには「INTERFACE」に関する詳細があります:https://people.sc.fsu.edu/~jburkardt/f_src/f90_calls_c++/f90_calls_c++。html – QuantumDot

答えて

1

実際にC++を使用しているようです。あなたは、引数の3つの異なるタイプのためにそれを行うことはできません

いいえ、あなたは

extern "C" void __swapper_MOD_swap(double*, double*) 

を行うことはできません、あなたも、引数の単一のタイプのためにそれを行うことはできません。しかし、最初のCまたはCスタイルC++答えます。

実際には、図書館には最初に__swapper_MOD_swapはありません。

Fortranは、3つの特定のサブルーチンswap_r, swap_i, swap_cのインターフェイス(何かを呼び出す方法です)を保持し、名前をswapと呼ぶことができます。

実際のサブルーチンswapはモジュールにありません!!! Fortranでは、これらの3つの詳細を別の名前で呼び出すことができます。それだけです。

これらの関数をgenericからCのように呼び出す方法はありません。 Cにはこの種のジェネリックがありません!(それはvoid*を使用してどのタイプでも動作するいくつかの機能を持っています)。

Cで


は、++あなたは、実際には異なるタイプのために特化されているジェネリックを作ることができますし、ジェネリックとしてFortranの手続きを呼び出すことができますが、C++自分自身にそれを伝える必要があります!テンプレートを作成し、このテンプレートを手動で特殊化して、適切な extern "C"関数を呼び出すことができます。例えば

しかし、すべては、Fortranで実装されextern "C" struct、一部extern "C"機能にリンクされている私はC++クラスを作る私のヘッダhttps://github.com/LadaF/PoisFFT/blob/master/src/poisfft.h参照します。


最後に、__swapper_MOD_記号を使用しないでください。 bind(C,name="some_name")を使用していくつかのFortranバインディングを作成し、some_nameextern "C"と呼んでください。異なるFortranコンパイラでは異なる名前のマングリングスキームが使用されるためです。

+0

ベストプラクティスのヒントなど、詳細な対応をありがとう! – QuantumDot

関連する問題