2017-03-08 4 views
2

へのFortranから構造化データ・タイプを渡します。は、私は、ポインタ(8 *実際のポインタデータ型)を含む大量のデータが含まれているFortranで構造化された型を持つC++

私はいくつかのFortranルーチンのC++ APIを開発しています。私はFortranルーチンへの呼び出しの間に構造の内容を保持する必要があります。

私はC++側にアドレスをLOCを使用して渡す構造体のアドレスを取得する方法について考えていました。 FortranのルーチンがC++から再び呼び出され、アドレスはバックのFortranへ渡される

は、何とか元の構造にそれを型キャストして、計算のためにそれを使用します。

これを達成するために私はどのようなアプローチをとることができますか?

ありがとうございました。

EDIT:私のコードのコメント/提案に基づきます。 C_LOCが呼び出されるとプログラムがクラッシュします(C_LOCへの呼び出しをコメントアウトするとプログラムがクラッシュしません)。

subroutine TEST(a,b,c,d,e,mystruct,ier) BIND(C, NAME='TEST') 
use mymodule 
USE, INTRINSIC :: ISO_C_BINDING 

implicit none 
TYPE(C_PTR)     :: mystruct 
TYPE(mymodule), TARGET  :: origstruct 
INTEGER      :: a, b, c 
DOUBLE PRECISION   :: d(*), e(*) 
INTEGER      :: ier 

!Do something with origstruct and other arguments 

print *, 'here 1' 
mystruct= C_LOC(origstruct) 
print *, 'here 2' 

end 
+0

は、これはやや広く、おそらく、もう少し具体的なあなたが考えている内容に作られているから利益を得るであろう。つまり、Fortranの派生型は完全に不透明で、C++側に関しては満足していますか?あなたがいるなら、潜在的な簡単な答えを示唆している。 – francescalus

+0

はい、私はFortranがC++に完全に不透明であることに満足しています。構造体の内容を知る必要はなく、構造体のハンドルを維持して後続の呼び出し間で再利用できるようにする必要があります。 –

+0

実際のコードを見る方がはるかに良いでしょう。実際には、Fortranでの型キャスティングは必要ありません。 Fortranは単にアドレスを取得し、構造体が参照渡しされると解釈します。 C++では 'void * 'になります。 –

答えて

1

Fortran 2003(現在のほとんどのコンパイラでサポートされています)では、標準のISO_C_BINDINGモジュールを使用できます。あなたはその後、いくつかのCプロシージャにこのポインタを渡すことができ

use, intrinsic :: ISO_C_BINDING 
type(your_struct_t), target :: your_obj 
type(C_PTR) :: p 

p = C_LOC(your_obj) 

:あなたが取得したCのポインタが(それはあなただけvoid*をしたい、である)「不透明」であることに満足している場合は、C_LOC機能を使用することができます

interface 
    subroutine mycproc(x, n, userdata) bind(C) 
     use, intrinsic :: iso_c_binding 
     integer(c_int), intent(in), value :: n 
     real(c_double), intent(in) :: x(n) 
     type(c_ptr), intent(in), value :: userdata 
    end subroutine 
end interface 

call mycproc(x, size(x), p) 
+0

私は元の質問とあなたの解決策(これは基本的に同じです)に解決策をたどりました。私がC_LOCメソッドを呼び出すと、プログラムがクラッシュします。理由は分かりませんか?サンプルコードを自分の質問に投稿します。 –

関連する問題